home *** CD-ROM | disk | FTP | other *** search
/ CD Actual 1 / PC Actual CD 01.iso / f1 / cimb.arj / TECNICO.TXT < prev    next >
Encoding:
Text File  |  1994-10-19  |  142.1 KB  |  3,745 lines

  1.             CONVERSOR DE IMAGENES DE MAPAS DE BITS
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.                 PROYECTO FIN DE CARRERA
  12.                   DIPLOMATURA EN INFORMATICA
  13.  
  14.             FACULTAD DE INFORMATICA Y ESTADISTICA
  15.                 UNIVERSIDAD DE SEVILLA
  16.  
  17.                  ANTONIO LADESA JURADO, 1994
  18.                 TUTOR: GABRIEL JIMENEZ MORENO                                                                           INDICE GENERAL
  19.  
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.                                                                 PARTE I
  30.                                              MANUAL TECNICO DEL PROGRAMA                                                                                            INDICE
  31.  
  32. 1 INTRODUCCION.
  33.  
  34. 2 OBJETIVOS.
  35.  
  36. 3 EL SISTEMA Y LOS RECURSOS EMPLEADOS.
  37.     3.1 HARDWARE.
  38.         3.1.1 LA PANTALLA GRAFICA.
  39.         3.1.2 LA GESTION DE LA MEMORIA.
  40.         3.1.3 EL INTERFACE CON EL USUARIO.
  41.         3.1.4 IMPRESION.
  42.     3.2 SOFTWARE.
  43.         3.2.1 HERRAMIENTAS DE DESARROLLO.
  44.         3.2.2 PROGRAMAS DE UTILIDAD.
  45.     3.3 LIMITACIONES Y POSIBLES AMPLIACIONES.
  46.         3.3.1 LIMITACIONES.
  47.         3.3.2 POSIBLES AMPLIACIONES.
  48.  
  49. 4 ESTRUCTURA GENERAL DE LA APLICACION. FLUJO DE DATOS.
  50.  
  51. 5 ESTRUCTURA DE LOS FICHEROS. FORMATOS GRAFICOS.
  52.     5.1 EL FORMATO TIFF (Tagged Image File Format)
  53.     5.2 EL FORMATO PCX (PC PAINTBRUSH)
  54.     5.3 EL FORMATO MAC (MACPAINT)
  55.     5.4 EL FORMATO IMG/GEM
  56.     5.5 EL FORMATO BMP (WINDOWS)
  57.     5.6 EL FORMATO TGA (TARGA)
  58.     5.7 EL FORMATO GIF (Graphics Interchange Format)
  59.  
  60. 6 ESTRUCTURAS DE DATOS. REPRESENTACION DE LAS IMAGENES.
  61.     6.1 LA ESTRUCTURA DE DATOS.
  62.     6.2 REPRESENTACION DE LAS IMAGENES.
  63.         6.2.1 SEGUN EL TIPO DE MEMORIA.
  64.             6.2.1.1 MEMORIA EMS.
  65.             6.2.1.2 MEMORIA XMS.
  66.             6.2.1.3 MEMORIA VMS.
  67.         6.2.2 SEGUN EL MODO DE VISUALIZACION.
  68.             6.2.2.1 MODO MONOCROMO.
  69.             6.2.2.2 MODO EGA.
  70.             6.2.2.3 MODO VGA.
  71.  
  72. 7 EL TRATAMIENTO DE LAS IMAGENES.
  73.     7.1 CONVERSION DE FORMATOS.
  74.         7.1.1 CARGA DE IMAGENES.
  75.         7.1.2 VISUALIZACION DE IMAGENES.
  76.         7.1.3 GRABACION DE IMAGENES.
  77.     7.2 TRANSFORMACION DE IMAGENES.
  78.         7.2.1 ESCALADO DE IMAGENES.
  79.         7.2.2 REFLEJO DE IMAGENES.
  80.         7.2.3 CONVERSION A GRIS Y A BLANCO Y NEGRO.
  81.             7.2.3.1 REDUCCION A TONOS DE GRIS.
  82.             7.2.3.2 APROXIMACION AL DITHERING. METODO BAYER.
  83.             7.2.3.3 DIFUSION DE ERRORES. ALGORITMOS.
  84.         7.2.4 OBTENCION DE NEGATIVOS.
  85.         7.2.5 ESCALADO DEL NUMERO DE COLORES.
  86.     7.3 IMPRESION DE IMAGENES.
  87.         7.3.1 LA IMPRESORA EPSON FX-80.
  88.         7.3.2 IMPRESORA POSTSCRIPT.
  89.  
  90. APENDICE A. LISTA NUMERICA DE TAGS. TIFF Versión 5.0
  91.  
  92. BIBLIOGRAFIA
  93. 1 INTRODUCCION.
  94.  
  95.     Sin duda alguna, una de las disciplinas que más auge ha
  96. adquirido en los últimos años en lo que a informática se
  97. refiere es la representación gráfica por ordenador.
  98.  
  99.     A ello ha contribuido de manera determinante el
  100. vertiginoso desarrollo del hardware, especialmente de los
  101. ordenadores personales. Los costes y tiempos de procesamiento
  102. se han reducido mientras que las capacidades de memoria y
  103. almacenamiento han aumentado. Esto ha propiciado la irrupción
  104. del mundo de la imagen en la ciencia informática. 
  105.  
  106.     Las aplicaciones gráficas son variadísimas: Autoedición,
  107. CAD, presentaciones, retoque fotográfico, post-producción de
  108. vídeo, animación, simulación, realidad virtual. Todo ello
  109. aderezado con la nueva aportación de la técnica al mundo
  110. informático: La multimedia.
  111.  
  112.     El impulso del tratamiento gráfico por ordenador ha dado
  113. lugar a la necesidad de unificar criterios a la hora de
  114. almacenar, intercambiar y representar los gráficos. Así surgen
  115. los formatos gráficos.
  116.     Las aplicaciones almacenan sus datos del modo más
  117. adecuado para su posterior tratamiento. Así, los programas de
  118. CAD almacenan sus datos mediante primitivas de dibujo mientras
  119. que las aplicaciones de tratamiento fotográfico usan mapas de
  120. bits.
  121.     Existen estándares gráficos para todas las aplicaciones
  122. posibles. Sin embargo no es posible unificar los formatos
  123. propios de cada tipo de aplicación en uno solo, de ahí la
  124. necesidad de desarrollar programas conversores entre los
  125. formatos gráficos. 2 OBJETIVOS.
  126.  
  127.     Esta obra se propone acercar al usuario informático los
  128. métodos para la conversión entre formatos gráficos de mapas de
  129. bits (bitmaps). Se define un gráfico de mapa de bits como una
  130. sucesión de bits que definen un conjunto de puntos de color
  131. con los que se constituye una imagen. Estos puntos de color
  132. reciben el nombre de pixels. Los pixels se constituyen como la
  133. unidad visual más pequeña de una imagen. 
  134.  
  135.     El estudio de los gráficos de mapas de bits comprende el
  136. conocimiento de las técnicas de codificación, compresión,
  137. visualización e impresión de las imágenes, así como de otras
  138. técnicas auxiliares de transformación como pueden ser el
  139. escalado o conversión de imágenes en color a blanco y negro.
  140.  
  141.     Por otro lado se hace imprescindible dar a conocer cómo
  142. se usan los elementos físicos de la máquina para permitir la
  143. puesta en práctica de las técnicas discutidas teóricamente. 
  144.  
  145.     Finalmente, el dominio de los conceptos relacionados con
  146. los gráficos de mapas de bits permitirá la inclusión y
  147. manipulación de éstos en las aplicaciones que el lector pueda
  148. desarrollar o la conversión de formatos no estándares en otros
  149. de uso generalizado.
  150.  
  151.     No es objeto de este estudio el competir con los potentes
  152. programas comerciales de tratamiento de imágenes que también
  153. poseen la habilidad de importar y exportar gráficos bitmap en
  154. distintos formatos, sino desvelar los secretos que gobiernan
  155. el tránsito de las imágenes entre el disco, la memoria y la
  156. pantalla. 3 EL SISTEMA Y LOS RECURSOS EMPLEADOS.
  157.  
  158. El proyecto ha sido desarrollado para su ejecución en
  159. ordenadores personales. Esto es posible gracias al gran avance
  160. tecnológico que estos sistemas han experimentado en pocos
  161. años. Cuando IBM comercializó el primer PC (Personal Computer)
  162. a principios de los 80, era impensable que este tipo de
  163. máquinas pudieran, en tan corto período de tiempo, permitir la
  164. ejecución de aplicaciones gráficas hasta ese momento sólo
  165. reservadas para equipos de gran capacidad.
  166. En este capítulo se van a tratar, por un lado, los
  167. elementos físicos (hardware) y por otro, los programas
  168. (software) requeridos para la implementación del proyecto.
  169.  
  170. 3.1 HARDWARE.
  171.  
  172.      Los ordenadores de tipo PC compatible son aquellos
  173. equipados con un microprocesador ix86 de INTEL. Esta familia
  174. de microprocesadores mantiene la compatibilidad entre los
  175. procesadores de versiones anteriores, con lo que los futuros
  176. procesadores pueden ejecutar las  aplicaciones de sus
  177. predecesores.
  178.  
  179.      La evolución sufrida en 15 años por este tipo de máquinas es
  180. espectacular. De 4,77 a 100 Megahercios de velocidad y de 8 a 32 bits de
  181. palabra, con lo que esto supone de incremento en la memoria direccionable.
  182. Conviene mencionar además el incremento en la capacidad y rapidez de los
  183. periféricos usados con estos procesadores.
  184.      La aplicación ha sido desarrollada para ser ejecutada en
  185. cualquiera de éstos procesadores.
  186.     El equipo debe procesador 8086 o superior.
  187. 3.1.1 LA PANTALLA GRAFICA.
  188.  
  189.      El adaptador o tarjeta de gráficos instalado en un
  190. microordenador determina la capacidad máxima de un sistema a
  191. la hora de la representación de las imágenes.
  192.      Esta capacidad para representar las imágenes viene
  193. definida por dos aspectos: Pixels y colores.
  194.  
  195.      Se define un pixel como el elemento visual más pequeño
  196. que puede ser controlado por el software en la pantalla. Un
  197. pixel está compuesto generalmente por la mezcla de los colores
  198. rojo, verde y azul (sistema RGB). La intensidad de cada uno de
  199. los tres colores primarios proporciona al pixel la tonalidad
  200. de éste en la pantalla.
  201.  
  202.      Así pues la capacidad máxima de un adaptador de gráficos,
  203. también llamada resolución, viene determinada por el número
  204. máximo de pixels y de colores simultáneos que pueden
  205. visualizarse en la pantalla.
  206.  
  207.      Existen varios estándares de adaptadores gráficos que
  208. ofrecen distintos modos de operación, cada uno de ellos
  209. caracterizado por una determinada resolución.
  210.      Los adaptadores más conocidos son: CGA, MCGA, EGA, VGA y
  211. SVGA, ordenados por su capacidad de menor a mayor.
  212.      Las resoluciones de cada uno de ellos oscilan entre los
  213. 320x200 pixels con 4 colores de la CGA hasta los 1280x1024 de
  214. 16 millones de colores (True Color o color real) de las más
  215. potentes tarjetas SVGA.
  216.  
  217.      Los adaptadores de gráficos difieren en el modo de
  218. organizar la memoria de pantalla y en la visualización de
  219. dicha memoria en el monitor[15]. La CGA usa una memoria de
  220. pantalla conocida como multibit por pixel, mientras que en las
  221. EGA y VGA utilizan memoria de pantalla multiplano por pixel.
  222.  
  223.      El sistema multiplano por pixel consiste en almacenar en
  224. la memoria de pantalla cuatro imágenes gráficas distintas.
  225. Cada imagen se denomina plano de bits. Cada plano de bits
  226. almacena la imagen completa de uno de los cuatro colores
  227. primarios utilizados: rojo, verde, azul y nivel de intensidad.
  228. El controlador de pantalla lee simultáneamente los bits
  229. correspondientes a los cuatro planos de bits, y los utiliza
  230. para determinar el color. Dado que cada plano de bits puede
  231. tener un valor 0 o 1 para cada pixel, la unión de los 4 bits
  232. (1 por plano) permite una variación de 0000 a 1111 en binario,
  233. lo que implica 16 posibles combinaciones. El color asociado a
  234. cada combinación es determinado por el hardware del
  235. controlador gráfico. En tarjetas EGA, que usan un sistema
  236. digital, el hardware dibuja en pantalla cada punto rojo, verde
  237. y azul, con una intensidad que puede ser nula, media o alta.
  238. En las VGA, que usan un sistema analógico, el hardware dibuja
  239. cada punto rojo, verde y azul, con una intensidad que puede
  240. variar desde 0 a un máximo. La mezcla visual de estos tríos de
  241. rojo verde y azul en la pantalla es lo que produce la aparente
  242. variación de tonalidades en el monitor.
  243.  
  244.      En el sistema multibit por pixel, se usa un solo plano,
  245. llamado mapa de bits. Cada pixel se representa en el mapa de
  246. bits con un determinado número de bits. En el modo CGA 320x200
  247. de 4 colores, se necesitan dos bits por pixel, ya que dos bits
  248. pueden representar cuatro colores distintos: 00, 01, 10 y 11.
  249. Para el modo 640x200 de 2 colores se requiere un bit por
  250. pixel.
  251.      Esta variedad en el modo de almacenamiento de las
  252. imágenes en la memoria de pantalla también ha sido adoptada
  253. por los formatos gráficos, con objeto de simplificar el
  254. software para la representación de las imágenes. En este
  255. estudio aparecen formatos que usan las dos técnicas.
  256.  
  257.      El programa ha sido desarrollado para trabajar sobre una
  258. tarjeta VGA. La elección no ha sido caprichosa. La tarjeta VGA
  259. se ha constituido como la controladora de vídeo más estándar y
  260. soporta todos los modos gráficos de sus antecesoras. 
  261.  
  262.      Los modos EGA 640x480 de 16 colores (válido también para
  263. imágenes monocromas) y VGA 320x200 de 256 colores son los
  264. usados en la aplicación que soporta el tratamiento de imágenes
  265. de hasta 256 colores. El tamaño de las imágenes no constituye
  266. ningún problema ya que el módulo visualizador del programa
  267. permite 'mover' la pantalla sobre la imagen (panning). 
  268.  
  269.      Las funciones para la visualización de las imágenes se
  270. encuentran en el módulo VIDEO. 3.1.2 LA GESTION DE LA MEMORIA.
  271.  
  272.      Uno de los principales aspectos a tener en cuenta a la
  273. hora de desarrollar una aplicación es el estudio de la memoria
  274. del sistema, con objeto de aprovecharla al máximo.
  275.      Al estudiar la memoria de los PCs, se pone de manifiesto
  276. la importante limitación del sistema operativo DOS en este
  277. aspecto. El DOS está diseñado para utilizar 1024kb de memoria,
  278. de los cuales sólo 640kb están disponibles para el usuario.
  279. Esta limitación viene dada porque el DOS fue diseñado en
  280. principio para los procesadores 8086 y 8088 de Intel, que solo
  281. eran capaces de direccionar 1Mb de memoria.
  282.  
  283.      En la actualidad, los PCs equipados con procesadores
  284. superiores permiten sobrepasar ampliamente este límite.
  285.  
  286.  
  287.      Los tipos de memoria de un PC son los siguientes:
  288.  
  289. - MEMORIA CONVENCIONAL
  290.  
  291.      Se llama memoria convencional a la memoria entre 0 y 640Kb. Todos
  292. los ordenadores disponen de ella. En esta memoria se almacena el sistema
  293. operativo, los controladores de dispositivo que aparecen en el
  294. fichero de configuración (CONFIG.SYS) y en el de arranque
  295. (AUTOEXEC.BAT), los programas residentes (TSR) y los de aplicación.
  296.  
  297.  
  298. - MEMORIA SUPERIOR
  299.  
  300.  El área de memoria superior es la zona de memoria situada entre los
  301. 640Kb y 1024Kb. En ella se encuentran, por ejemplo, los datos
  302. del hardware (tarjeta gráfica, monitor). Una parte de
  303. esta memoria, no utilizada por el sistema, la constituyen
  304. los bloques de memoria superior (UMB), que se pueden usar
  305. para almacenar controladores de dispositivo, liberando
  306. así memoria convencional para ejecutar aplicaciones.
  307.  
  308. - MEMORIA EXTENDIDA
  309.  
  310.      A la memoria que comienza más allá de 1Mb se la
  311. conoce como memoria extendida. Este tipo de memoria
  312. (denominada también XMS) sólo está disponible en equipos
  313. dotados con microprocesador 80286 o superior. En equipos
  314. 386 y 486 se podría llegar hasta 4096Mb. Estos
  315. microprocesadores tienen dos modos de funcionamiento:
  316.     - Modo real, emulando al 8086. La memoria XMS se usa
  317.      para guardar datos, para lo que se requiere instalar un
  318.      controlador (driver) de memoria extendida, como el
  319.      HIMEM.SYS suministrado por el DOS.
  320.     - Modo protegido, aprovechando todas sus
  321.      características. Se usa para guardar datos y programas.
  322.  
  323. - MEMORIA EXPANDIDA
  324.  
  325.     Se conoce también con el nombre de memoria EMS y
  326. fue diseñada por Lotus/Intel/Microsoft. Una ventaja sobre
  327. la memoria XMS es que funciona en cualquier microprocesador,
  328. por contra, el acceso a esta memoria es más lento.
  329.     En principio esta memoria consistía en una tarjeta
  330. de expansión que se utilizaba por medio de un driver.
  331. Actualmente, en ordenadores 386 y 486 es posible emular
  332. estas tarjetas a partir de la memoria extendida. En
  333. cualquiera de los dos casos es necesario instalar un
  334. controlador en el fichero de configuración como el
  335. EMM386.EXE suministrado con el DOS. Solo pueden acceder a
  336. esta memoria las aplicaciones preparadas para ello. Estos
  337. programas acceden a ella por medio de una zona llamada
  338. marco de página (page frame) localizada en la memoria
  339. superior. La memoria expandida está dividida en bancos o
  340. bloques de 16Kb cada uno. En el marco de página se pueden
  341. situar 4 bancos de memoria. Cuando un programa de
  342. aplicación necesita datos que no están en las direcciones
  343. apuntadas por los bancos situados en el marco de página,
  344. se produce el mapeado entre páginas lógicas (las del
  345. marco de página) y páginas físicas (las de la memoria
  346. expandida), con lo que se consigue el acceso a las
  347. páginas de memoria deseadas.
  348.  
  349. - AREA DE MEMORIA BAJA
  350.  
  351.     La zona de memoria baja está formada por los
  352. primeros 64Kb de la memoria convencional. En ella se
  353. carga normalmente el sistema operativo, los controladores
  354. de dispositivo, la tabla de interrupciones y el área de
  355. datos del DOS.
  356.  
  357. - AREA DE MEMORIA ALTA
  358.  
  359.     La zona de memoria alta (HMA) está formada por los
  360. primeros 64Kb de la memoria extendida. No se utiliza
  361. normalmente por los programas, por lo que se suele cargar
  362. en ella una parte del sistema operativo.
  363.  
  364. - MEMORIA VIRTUAL
  365.  
  366.     El término memoria virtual se usa para designar
  367. aquella memoria que no existe realmente pero que puede
  368. simularse usando algún proceso de gestión de la memoria
  369. existente.
  370.     En nuestro caso, el término 'memoria virtual' hace
  371. referencia a la utilización de un área de disco como si
  372. se tratase de memoria. Con ello se puede superar la
  373. carencia de memoria extendida o expandida, si bien este
  374. sistema es más lento y requiere de espacio disponible en
  375. el disco.
  376.  
  377.      La aplicación se ha desarrollado intentando aprovechar
  378. todos los tipos de memoria que el equipo pueda tener
  379. instalados.
  380.  
  381.      El programa funciona sobre memoria convencional, mientras
  382. que las imágenes usan memoria extendida, expandida o
  383. 'virtual'.
  384.      Para permitir el uso de memoria XMS y EMS se requiere de
  385. un driver o controlador de memoria residente que se especifica
  386. en el fichero de configuración CONFIG.SYS[14]. En este caso se
  387. han usado los controladores HIMEM.SYS y EMM386.EXE
  388. respectivamente. Además el programa requiere de unas rutinas
  389. para la detección y uso de la memoria a través de llamadas al
  390. controlador de memoria.
  391.      Para el uso de la 'memoria virtual', basta con que exista
  392. espacio libre suficiente en el disco.
  393.  
  394.      Las funciones usadas por el programa para el manejo de la
  395. memoria se encuentran en los módulos MEMORIA, XMS, EMS y VMS.
  396.  
  397.      El uso de memoria XMS, EMS y 'virtual' para el
  398. almacenamiento temporal de las imágenes se explica más
  399. adelante en el apartado 4.
  400. 3.1.3 EL INTERFACE CON EL USUARIO.
  401.  
  402.  
  403.      El auge experimentado por la informática ha traído
  404. consigo la preocupación cada vez más generalizada de
  405. proporcionar al usuario un entorno de trabajo cada vez más
  406. intuitivo y fácil de manejar. Esto se ha conseguido
  407. presentando programas que aprovechen las capacidades gráficas
  408. de las máquinas, ya que, resulta mucho más agradable trabajar
  409. con un interface gráfico que tener que aprender comandos y
  410. combinaciones de teclas para que la máquina realice una
  411. operación determinada. Un ejemplo claro de esto es el éxito de
  412. entornos y sistemas operativos como Windows u OS/2.
  413.  
  414.      Este proyecto trabaja bajo el sistema operativo DOS, pero
  415. presenta un interface gráfico basado en el ratón para
  416. facilitar al usuario el manejo del programa.
  417.      El interface gráfico usado se basa en la pulsación con el
  418. ratón sobre unas 'teclas' o áreas dibujadas en la pantalla.
  419. Esta pulsación dará lugar a la ejecución de una acción (Por
  420. ejemplo, ver una imagen) o a la aparición de un nuevo menú en
  421. el que existen más teclas o áreas para seleccionar.
  422.  
  423.      El ratón (mouse) se ha convertido en un elemento
  424. imprescindible. El uso del ratón requiere la instalación del
  425. dispositivo físico (el ratón en sí y a veces una tarjeta
  426. controladora) y de un software controlador del ratón. El uso
  427. del ratón en un programa requiere tener instalado un manejador
  428. o driver de ratón, como MOUSE.COM suministrado con el DOS para
  429. ratones compatibles con Microsoft. El acceso al driver del
  430. ratón desde un programa se consigue usando la interrupción 33H
  431. de los procesadores de la familia ix86.
  432.      Los distintos servicios de esta interrupción permiten
  433. inicializar el driver del ratón, indicar si hay un ratón
  434. instalado y su tipo (número de botones) en caso afirmativo.
  435. Otras funciones permiten conocer la posición actual del ratón,
  436. el estado de los botones (presionado o no), hacer visible o no
  437. el cursor del ratón en la pantalla, etc. Las funciones de
  438. manejo del ratón usadas por el programa se encuentran en el
  439. módulo RATON.
  440.  
  441.      El uso del ratón es necesario pero no suficiente. En
  442. ocasiones se hace necesaria la introducción de cadenas de
  443. caracteres o valores numéricos, para lo que se ha de recurrir
  444. al tradicional teclado.
  445.  
  446.      Las funciones para la gestión de las teclas y los menús
  447. se encuentran en los módulos TECLAS y MENU.
  448.  
  449.      Para más detalles sobre el interface gráfico, consultar
  450. el manual de uso de la aplicación.
  451.     3.1.4 IMPRESION.
  452.  
  453.  
  454.      Toda aplicación debe ofrecer al usuario la posibilidad de
  455. obtener la información tratada por el programa en un soporte
  456. físico tangible, como es el papel. Para ello se usan las
  457. impresoras.
  458.  
  459.      Existen tres tipos de impresoras atendiendo a la
  460. tecnología usada para la impresión: 
  461.  
  462.      Las impresoras matriciales se basan en la misma
  463. tecnología de las tradicionales máquinas de escribir: Un
  464. cabezal impacta sobre una cinta impregnada de tinta y estampa
  465. sobre el papel el símbolo deseado. El cabezal de una impresora
  466. matricial está compuesto por una columna de agujas (en número
  467. variable de 8 a 24) que serán las que impacten en la cinta,
  468. dando forma así al carácter impreso. Una impresora que se ha
  469. constituido como un estándar en las impresoras matriciales es
  470. la EPSON FX-80 de 9 agujas.
  471.  
  472.      Las impresoras de inyección de tinta sustituyen la cinta
  473. y las agujas de las matriciales, por unos inyectores de tinta
  474. que salpican el papel.
  475.  
  476.      Las impresoras láser producen la impresión usando un
  477. sistema similar al de las copiadoras, calentando un fino polvo
  478. de tinta llamado 'toner' que se adhiere al papel.
  479.  
  480.      Las impresoras usadas más comúnmente son en blanco y
  481. negro. Las impresoras de color son, por el momento, más caras
  482. y, por tanto, menos accesibles para el usuario.
  483.  
  484.      Uno de los principales problemas que surgen a la hora de
  485. imprimir una imagen de color es la de representar los colores
  486. de ésta en un dispositivo en blanco y negro como es la
  487. impresora. La mayoría de las modernas impresoras proporcionan
  488. códigos de control para hacer esta operación, encargándose
  489. ellas del proceso. Así, existen lenguajes de descripción de
  490. páginas como el PostScript. El PostScript fue desarrollado por
  491. Adobe y es reconocido por determinadas impresoras (usualmente
  492. con tecnología láser) que incluyen un intérprete de dicho
  493. lenguaje.
  494.  
  495.      Este trabajo se encarga de estudiar la problemática
  496. citada anteriormente sobre el color y propone soluciones para
  497. la impresión de las imágenes en impresoras EPSON FX80 (o
  498. compatibles) y PostScript.
  499.  
  500.      Los módulos encargados de la impresión de las imágenes
  501. son PSCRIPT y EPSON. 3.2 SOFTWARE.
  502.  
  503.      Toda realización de un proyecto informático requiere la
  504. utilización de otro software que permita el desarrollo,
  505. implantación y prueba del sistema creado.
  506.  
  507.      Los programas usados en la elaboración del proyecto
  508. pueden dividirse en dos grupos principales: las herramientas
  509. constituyentes del sistema de desarrollo (editores,
  510. compiladores, etc.) y los programas de utilidad para verificar
  511. el funcionamiento del programa a desarrollar.
  512.  
  513.  
  514. 3.2.1 HERRAMIENTAS DE DESARROLLO.
  515.  
  516.      La aplicación ha sido desarrollada en casi su totalidad
  517. en lenguaje C, exceptuando un par de módulos que se han
  518. codificado en lenguaje ensamblador.
  519.  
  520.      El compilador de C usado ha sido el Turbo C++ 2.0 de
  521. Borland.
  522.  
  523.      El ensamblador ha sido el Turbo Assembler 1.0 de Borland.
  524.  
  525.      También se ha usado como guía de programación para
  526. ciertas rutinas el programa HelpPC 2.10 que ofrece información
  527. de utilidad sobre aspectos muy relacionados con la máquina.
  528.  
  529.  
  530. 3.2.2 PROGRAMAS DE UTILIDAD.
  531.  
  532.      Para realizar un control de fiabilidad de los ficheros de
  533. formatos gráficos generados por el programa, se hace necesaria
  534. la utilización de otros programas de conversión existentes en
  535. el mercado. Estos han sido:
  536.  
  537.      GWS 6.1 para DOS
  538.      CSHOW 8.50a
  539.  
  540. 3.3 LIMITACIONES Y POSIBLES AMPLIACIONES.
  541.  
  542.  
  543. 3.3.1 LIMITACIONES.
  544.  
  545.      Intentar abarcar en un solo proyecto todos los formatos
  546. gráficos sobre imágenes de mapas de bits existentes y todas
  547. las posibilidades ofrecidas por cada uno de ellos no es una
  548. tarea fácil de realizar. Por citar un ejemplo, las
  549. especificaciones completas de la versión 5.0 del formato TIFF
  550. constituyen un documento de alrededor de 40 páginas. Teniendo
  551. en cuenta la cantidad de posibilidades de codificación de las
  552. imágenes en este formato y los distintos métodos de compresión
  553. que usa, un programa codificador y decodificador de imágenes
  554. en formato TIFF podría constituirse por si solo en un proyecto
  555. de similar o mayor magnitud a éste.  
  556.  
  557.      Así pues y como ya se esbozó en los objetivos, la
  558. aplicación contempla la lectura y escritura de imágenes de
  559. mapas de bits en los formatos más representativos del género
  560. y, dentro de cada uno de ellos, de los más usados en la
  561. actualidad. También se han de tener en cuenta las limitaciones
  562. del sistema informático usado.
  563.  
  564.  
  565. 3.3.2 POSIBLES AMPLIACIONES.
  566.  
  567.      Toda vez que se sientan las bases para la implantación de
  568. una aplicación, ésta es susceptible de ser modificada y
  569. mejorada hasta límites únicamente determinados por el propio
  570. autor de las modificaciones.
  571.  
  572.      Aspectos a mejorar y que podrían constituirse como
  573. objetivos para otro proyecto de mayor envergadura podrían ser:
  574.  
  575.      * Soporte para otros entornos operativos (Windows,UNIX).
  576.  
  577.      * Codificación de las rutinas en otros lenguajes.
  578.  
  579.      * Adición de nuevos formatos gráficos y ampliación de los
  580.      ya tratados.
  581.  
  582.      Y en general todas las sugerencias que se puedan hacer
  583. para mejorar el programa y permitir el acceso al usuario al
  584. mundo de los gráficos por ordenador. 4 ESTRUCTURA GENERAL DE LA APLICACION. FLUJO DE DATOS.
  585.  
  586.      Para que las aplicaciones gráficas puedan almacenar
  587. imágenes para su uso posterior, éstas deben guardarse en un
  588. fichero. Si cada aplicación utiliza su propio formato, el
  589. intercambio de imágenes entre aplicaciones implica la
  590. utilización de traductores de formatos. En un grupo de N
  591. aplicaciones con formatos diferentes, serán necesarios N*(N-1)
  592. traductores diferentes si se quieren compartir los datos entre
  593. todas las aplicaciones. El costo para desarrollar y mantener
  594. todos estos programas resulta prohibitivo. También resulta
  595. imposible pretender usar un sólo formato para todas las
  596. aplicaciones. En cambio si se puede usar un formato gráfico
  597. común o estándar gráfico de almacenamiento que sirva de paso
  598. intermedio para la traducción.
  599.  
  600.      Este mismo enfoque se traslada para la implementación del
  601. conversor entre formatos gráficos estándares. La transición
  602. entre los formatos se hace mucho más fácil si se adopta una
  603. estructura de datos en memoria común a todos ellos.
  604.      Esta estructura de datos servirá como destino para cada
  605. uno de los módulos lectores o decodificadores de cada formato
  606. y, se constituirá a la vez como origen para los algoritmos de
  607. escritura o codificadores de cada formato.
  608.      Esta estructura para el almacenamiento temporal de la
  609. imagen en memoria también será usada para la visualización,
  610. manipulación e impresión de las imágenes. 
  611.  
  612.  
  613. 5 ESTRUCTURA DE LOS FICHEROS. FORMATOS GRAFICOS.
  614.  
  615.      Este capítulo se propone explicar la estructura de los
  616. distintos formatos gráficos tratados por la aplicación. Estos
  617. son:
  618.  
  619.     - TIFF (Tagged Image File Format). [1], [3], [7] y [11].
  620.     - PCX (PC Paintbrush). [1] y [6].
  621.     - MAC (MacPaint Files). [1].
  622.     - IMG/GEM (Ventura Publisher). [1] y [8].
  623.     - BMP (Windows 3.X). [2].
  624.     - TGA (Targa TrueVision). [11].
  625.     - GIF (Graphics Interchange Format). [1],[6],[9] y[10].
  626.  
  627.      En el capítulo 3, se habla de la limitación de no poder
  628. tratar todos los formatos gráficos y todas las variantes que
  629. cada uno posee. En la siguiente tabla se muestran, para cada
  630. uno de los formatos usados, los tipos de imágenes susceptibles
  631. de ser leídas y escritas por la aplicación.
  632.  
  633. FORMATO            TIPO        COMPRESION    LECTURA ESCRITURA
  634.  
  635. TIFF Hasta 256 colores  CLASE B        32773        SI    NO
  636.                     SIN COMPRIMIR   SI      SI
  637.             CLASE G        SIN COMPRIMIR   SI      SI
  638.             CLASE P        SIN COMPRIMIR   SI      SI
  639.             CLASE R                      NO      NO
  640.  
  641. PCX                     MONOCROMO    RUN-LENGTH      SI      SI
  642.             16 COLORES    RUN-LENGTH      SI      SI
  643.             256 COLORES    RUN-LENGTH      SI      SI
  644.  
  645. MAC                     MPNT        32773           SI      SI
  646.  
  647. IMG/GEM                 MONOCROMO    PROPIA          SI      SI
  648.             16 GRISES    PROPIA          SI      SI
  649.             256 GRISES    PROPIA          SI      SI
  650.  
  651. BMP            2 A 256 COLORES SIN COMPRIMIR   SI      SI
  652.  
  653. TGA (HASTA 256 COLORES)         SIN COMPRIMIR   SI      SI
  654.  
  655. GIF                     87a        LZW             SI      SI (256 COLORES)
  656.                                                 89a          LZW             SI      SI (256 COLORES)
  657.  
  658. 5.1 EL FORMATO TIFF (Tagged Image File Format)
  659.  
  660. GENERALIDADES SOBRE LOS FICHEROS TIFF
  661.  
  662.      Ha sido desarrollado conjuntamente por Microsoft Corp. y
  663. Aldus Corp. (el creador de PageMaker) para estandarizar los
  664. formatos gráficos usados en autoedición. Su potencia lo ha
  665. consolidado como uno de los estándares en el intercambio de
  666. imágenes digitales. Es independiente del microprocesador, la 
  667. tarjeta de vídeo, el sistema operativo y la organización de
  668. los discos. Un fichero TIFF puede alcanzar hasta 232 bytes ya
  669. que usa punteros de 4 bytes para referenciar desplazamientos.
  670.  
  671. CARACTERISTICAS DE LOS FICHEROS TIFF
  672.  
  673.      A diferencia de la mayoría de los formatos existentes,
  674. TIFF es un formato dinámico, esto es, los datos no se guardan
  675. en una posición determinada del fichero, sino que pueden
  676. variar su posición de un fichero a otro y lo que es más
  677. importante es que es fácilmente modificable a la hora de
  678. añadir nuevas características que definan la imagen. 
  679.      Los ficheros TIFF pueden contener imágenes de cualquier
  680. tipo, desde monocromáticas hasta color real, aceptan distintos
  681. tipos de compresión y codificación, imágenes almacenadas por
  682. pixel o por planos.
  683.      Todo ello se debe a la particular y eficaz estructura que
  684. el formato posee. La base de esta estructura son los Tags o
  685. etiquetas, a las que debe su nombre y que se estudian más
  686. adelante.
  687.  
  688. AMBITO DEL ESTUDIO
  689.  
  690.      Intentar abarcar todas las posibilidades que los ficheros
  691. TIFF ofrecen sería una tarea que daría material para
  692. constituirse en una obra por sí misma. No obstante, los
  693. creadores del formato han definido cuatro tipos de ficheros
  694. TIFF que atienden a unos requisitos mínimos con objeto de
  695. poder encasillar los ficheros y hacer más fácil su estudio. En
  696. esta obra se estudian estos tipos de ficheros TIFF y la forma
  697. de reconocerlos, así como la implementación de los más
  698. característicos: Monocromos, Grises y de Color, estos últimos
  699. hasta 256 colores. El método de compresión estudiado será el
  700. PackBits usado también en los fichero MacPaint.
  701. ESTRUCTURA DE UN FICHERO TIFF
  702.  
  703.      Como se señaló antes, el formato TIFF es dinámico y la
  704. información en él contenida puede no estar siempre codificada
  705. de la misma forma.
  706.      Lo que si son invariables son sus tres elementos
  707. principales:
  708.  
  709. - Cabecera.
  710. - Directorio de Tags o IFDs ( Image File Directory)
  711. - Datos.
  712.  
  713.      Pasemos a estudiarlos detenidamente.
  714.  
  715. CABECERA
  716.  
  717.      Es el único elemento con posición fija. Ocupa siempre los
  718. 8 primeros bytes del fichero y su estructura es la siguiente:
  719.  
  720. BYTE TAMAÑO CAMPO                         DESCRIPCION Y CONTENIDO
  721. 0    2      formato                       Formato de almacenamiento
  722.                                                                                     'II' : Intel
  723.                                                                                     'MM' : Motorola
  724. 2    2      identificador                 Número de la versión = 42
  725. 4    4      pixels_por_linea              Puntero al primer IFD o directorio
  726.                                                                                     de Tags
  727.  
  728.      El primero de los campos (formato) sirve para determinar
  729. si los bytes se almacenan con formato Intel (De menos a más
  730. significativo) o Motorola (De más a menos significativo).
  731.  
  732.      El segundo (identificador) es la versión. Realmente es
  733. una constante que vale siempre 42, aunque el fichero
  734. pertenezca a una versión u otra.
  735.  
  736.      El tercer y último campo es un puntero de 32 bits que
  737. indica el lugar dentro del fichero donde se encuentra el
  738. primer IFD o directorio de Tags, cuya estructura se explica a
  739. continuación. DIRECTORIO DE TAGS o IFD
  740.  
  741.      Un IFD se compone de:
  742. - Un número de 2 bytes que indica el número de tags que contiene
  743. el directorio.
  744. - Uno o más tags, hasta completar el número de tags.
  745. - Un puntero al siguiente IFD. En caso de no existir
  746. más IFDs, este campo valdrá 0000.
  747.  
  748. A continuación se estudian los tags. TAG. La estructura de los datos.
  749.  
  750.      El término tag puede traducirse como etiqueta o campo. Es
  751. un elemento de 12 bytes asociado a algún parámetro de la
  752. imagen almacenada en el fichero TIFF. Así un tag puede indicar
  753. el ancho del fichero, el número de colores, la posición de
  754. inicio de la imagen, etc.
  755.  
  756.      La estructura de un tag es la siguiente:
  757.  
  758. BYTE TAMAÑO CAMPO                         DESCRIPCION Y CONTENIDO
  759. 0    2      numero                        Número o identificador del tag
  760. 2    2      tipo                          Tipo del dato asociado al tag
  761.                         1: BYTE
  762.                         2: ASCII
  763.                         3: SHORT
  764.                         4: LONG
  765.                         5: RATIONAL
  766. 4    4      longitud                      Longitud del dato asociado al tag
  767. 8    4      desplazamiento                Puntero al dato o valor del dato
  768.  
  769.      El primer campo del tag (numero) es un entero de dos
  770. bytes que identifica al tag en cuestión. Dentro de un IFD, los
  771. tags deben estar ordenados en orden ascendente al número de
  772. tag. Más adelante se explican los tags usados en esta obra y
  773. el apéndice A muestra una lista de todos los tags de la
  774. versión 5.
  775.  
  776.      El segundo campo (tipo) es otro entero de dos bytes que
  777. indica el tipo de dato asociado al tag. Puede tener cinco
  778. valores posibles:
  779.  
  780.      1 BYTE: Un número de 8 bits sin signo.
  781.      2 ASCII: Una Cadena de caracteres ascii, terminada en 0.
  782.      3 SHORT: Un número de 16 bits sin signo.
  783.      4 LONG: Un número de 32 bits sin signo.
  784.      5 RATIONAL: Dos números de 32 bits sin signo. El primero
  785.      es el numerador y el segundo el denominador.
  786.  
  787.      El tercer campo (longitud) es la longitud de los datos
  788. asociados al tag. Este valor no se da en bytes, sino en número
  789. de elementos del tipo de tag. Por ejemplo, una longitud 2 para
  790. un tag de tipo SHORT (entero de dos bytes) supone un total de
  791. 4 bytes (dos elementos SHORT de dos bytes cada uno). En el
  792. caso del tipo ASCII, también se contabiliza el carácter nulo
  793. de terminación de la cadena de caracteres.
  794.  
  795.  
  796.     El cuarto y último campo (desplazamiento) puede tener dos
  797. funciones:
  798.     1. Por definición es un puntero de 4 bytes que
  799. indica el desplazamiento dentro del fichero donde se
  800. encuentran los datos asociados con el tag. Esto ocurre
  801. normalmente cuando se trata de una cadena de caracteres
  802. (el nombre del autor de la imagen) o una sucesión de
  803. números (la paleta de colores).
  804.  
  805.     2. Cuando se trata de un valor de tipo BYTE, SHORT o
  806. LONG, los cuatro últimos bytes del tag no almacenan el
  807. puntero al valor, sino el propio valor, ahorrando con
  808. ello espacio en el fichero.
  809. TAGS USADOS POR LA APLICACION
  810.  
  811.      La estructuración en tags permite al formato una gran
  812. flexibilidad y dinamismo, así como la posibilidad de añadir
  813. nuevas definiciones de tags a medida que se vayan necesitando.
  814. Por otra parte el programa decodificador del fichero TIFF
  815. puede ignorar los tags que no necesite. En algunos casos, 
  816. cuando un tag no aparece, toma un valor por defecto.
  817.  
  818.      Este apartado explica los tags usados en la aplicación.
  819. Para cada uno se enumeran su nombre (Se ha respetado el idioma
  820. inglés), su número (en decimal y hexadecimal), su tipo y
  821. longitud.
  822.  
  823.  
  824. BitsPerSample
  825.  
  826. Tag     : 258  (102)
  827. Tipo    : SHORT
  828. Longitud: SamplesPerPixel
  829.  
  830.      Es el número de bits por muestra. Permite, junto con
  831. SamplesPerPixel determinar el espacio que ocupa un pixel.
  832. Notar que este tag permite un número diferente de bits por
  833. muestra para cada muestra correspondiente a un pixel.
  834.      Por ejemplo, los datos de color RGB podrían usar un
  835. número diferente de bits por muestra para cada uno de los tres
  836. planos de color.  La mayoría de los ficheros RGB tienen el
  837. mismo número de BitsPerSample para cada muestra.
  838.  
  839. Por defecto es 1.
  840.  
  841. Ver también SamplesPerPixel.
  842.  
  843.  
  844. ColorMap
  845.  
  846. Tag     : 320 (140)
  847. Tipo    : SHORT
  848. Longitud: 3 * (2**BitsPerSample)
  849.  
  850.      Tabla de colores. Este tag define una tabla o paleta de
  851. colores RGB formada por tres subcurvas (Rojo, Verde y Azul).
  852. El valor de color del pixel es usado como índice a las 3
  853. subcurvas.
  854.      Por ejemplo, un pixel con el valor 0 será visualizado de
  855. acuerdo con la entrada 0 de cada una de las subcurvas.
  856. Las subcurvas son almacenadas secuencialmente. Primero las
  857. entradas de rojo, seguidas por las entradas de verde y las de
  858. azul.
  859.      La longitud de cada subcurva es 2**BitsPerSample.  Una
  860. paleta para una imagen de 8 bits de color (256 colores) tendrá
  861. 3 * 256 entradas.  El ancho de cada entrada es de 16 bits
  862. (tipo SHORT). El 0 representa la mínima intensidad y 65535
  863. representa la máxima intensidad. El negro se representa por
  864. 0,0,0, y el blanco por 65535, 65535, 65535.  El propósito de
  865. la tabla de colores (lookup table) es mapear los valores de
  866. los pixels desde 0 hasta 2**BitsPerSample-1 en triples RGB.
  867.  
  868.      El campo ColorResponseCurves puede ser usado
  869. conjuntamente con ColorMap para refinar los colores RGB del
  870. campo ColorMap.
  871.  
  872.      No hay paleta de color por defecto.  ColorMap debe ser
  873. incluido en todas las imágenes de paleta de color.
  874.  
  875.  
  876. Compression
  877.  
  878. Tag     : 259  (103)
  879. Tipo    : SHORT
  880. Longitud: 1
  881.  
  882. Tipo de compresión usado:
  883.  
  884. 1 = No comprimido.
  885.     Los bytes son almacenados en un array de tipo BYTE
  886. si BitsPerSample <=8, en uno de tipo SHORT si
  887. BitsPerSample >8 y <=16, y en uno de tipo LONG si
  888. BitsPerSample >16 y <=32.
  889.     El orden de los bytes de datos >8 bits debe estar en
  890. consonancia con lo especificado en los bytes 0 y 1 de la
  891. cabecera del fichero en lo referente a los formatos Intel
  892. ('II') y Motorola ('MM').
  893.     Si el número de bits por muestra no es potencia de
  894. 2, es recomendable usar la siguiente potencia de 2
  895. perdiendo así en espacio pero ganando en rendimiento a la
  896. hora del tratamiento de las imágenes.
  897.  
  898. 2 = CCITT Group 3 1-Dimensional Modified Huffman run length
  899. encoding.
  900.  
  901. 3 = Facsimile-compatible CCITT Group 3.
  902.  
  903. 4 = Facsimile-compatible CCITT Group 4.
  904.  
  905. 5 = LZW. 
  906.     Usado para escala de gris, mapa de color e imágenes
  907. RGB de color real.
  908.  
  909. 32773 = PackBits.
  910.      Es un simple esquema run-length para imágenes de 1 bit.
  911. El algoritmo es el mismo usado para la descompresión de
  912. ficheros MacPaint.
  913.      El método es el siguiente:
  914.  
  915.      Se lee un byte del fichero.
  916.  
  917.      Si el bit más significativo de este byte vale 0, se usa
  918.      como contador para indicar cuántos bytes han de leerse
  919.      del fichero como bytes de datos.
  920.  
  921.      Si el bit menos significativo vale 1, se le hace el
  922.      complemento a dos y se usa como contador para indicar
  923.      cuántas veces se usará el siguiente byte del fichero como
  924.      byte de dato.
  925.  
  926.      El algoritmo de lectura:
  927.  
  928.     PARA cada byte "c" leído del fichero
  929.         SI el bit más significativo de "c" vale 0
  930.             contador = siguiente byte del fichero
  931.             MIENTRAS contador > 0
  932.                 dato = siguiente byte del fichero
  933.                 contador = contador - 1
  934.             FIN MIENTRAS
  935.         SINO ( el bit más significativo de "c" vale 1)
  936.             contador = complemento a dos de "c"
  937.             dato = siguiente byte del fichero
  938.         FINSI
  939.  
  940.      En esta aplicación se leen ficheros TIFF sin comprimir y
  941. comprimidos usando este último método.
  942.      Los ficheros TIFF generados por la aplicación no usan
  943. método de compresión.
  944.  
  945.      Para terminar con el tema de la compresión, conviene
  946. decir que ésta sólo afecta a los datos de la imagen apuntados
  947. por el campo StripOffsets. Toda la información restante no es
  948. comprimida.
  949.  
  950. Por defecto es 1.
  951.  
  952. ImageLength
  953.  
  954. Tag     : 257  (101)
  955. Tipo    : SHORT o LONG
  956. Longitud: 1
  957.  
  958.      Es el alto de la imagen en pixels (Y: vertical). El
  959. número de líneas de la imagen, llamado a veces 'scan lines'.
  960.  
  961. Ver también ImageWidth.
  962.  
  963. No hay valor por defecto.
  964. ImageWidth
  965.  
  966. Tag     : 256  (100)
  967. Tipo    : SHORT o LONG
  968. Longitud: 1
  969.  
  970.      El ancho de la imagen en pixels (X: horizontal).  Es el
  971. número de columnas de la imagen.
  972.  
  973. Ver también ImageLength.
  974.  
  975. No hay valor por defecto.
  976.  
  977.  
  978. NewSubfileType
  979.  
  980. Tag =  254  (FE)
  981. Tipo = LONG
  982. N = 1
  983.  
  984.      Reemplaza al antiguo SubfileType debido a las
  985. limitaciones de éste.
  986.  
  987.      Da una indicación general del tipo de los datos contenido
  988. en el fichero.  Es un registro de 32 bits, usados como
  989. banderas.
  990. Los bits que no se usan deben ser 0. El bit 0 es el menos
  991. significativo.
  992.  
  993. Los valores definidos actualmente son:
  994.  
  995. Bit 0:
  996.      1 si la imagen es una versión reducida; si no el bit es
  997. 0.
  998.  
  999. Bit 1:
  1000.      1 si la imagen es una página de una imagen con múltiples
  1001. páginas; si no el bit es 0.
  1002.  
  1003. Bit 2:
  1004.      1 si la imagen define una máscara de transparencia. En
  1005. este caso PhotometricInterpretation bebe ser 4.
  1006.  
  1007. Por defecto vale 0.
  1008.  
  1009.  
  1010. PhotometricInterpretation
  1011.  
  1012. Tag     : 262  (106)
  1013. Tipo    : SHORT
  1014. Longitud: 1
  1015.  
  1016. Interpretación fotométrica.
  1017. 0 = Para imágenes monocromas y de tonos de gris.
  1018. El 0 es el blanco y 2**BitsPerSample-1 es el negro.
  1019.  
  1020. 1 = Para imágenes monocromas y de tonos de gris.
  1021. El 0 es el negro y 2**BitsPerSample-1 es el blanco.
  1022.  
  1023. 2 = RGB.
  1024.      En el modelo RGB, un color es descrito como una
  1025. combinación de los tres colores primarios de la luz (rojo,
  1026. verde y azul) en concentraciones particulares. Para cada una
  1027. de las tres muestras, el 0 representa la mínima intensidad y
  1028. 2**BitsPerSample - 1 representa la máxima intensidad. Así un
  1029. valor RGB de (0,0,0) representa el negro y (255,255,255)
  1030. representa el blanco, asumiendo muestras de 8-bit.
  1031. Para PlanarConfiguration = 1, las muestras son almacenadas una
  1032. a una en el orden indicado: primero rojo, después verde y
  1033. después azul.
  1034. Para PlanarConfiguration = 2, las muestras son almacenadas por
  1035. planos en el orden indicado: primero rojo, después verde y
  1036. después azul.
  1037.      El campo ColorResponseCurves puede ser usado para refinar
  1038. los colores.
  1039.  
  1040. 3 = Paleta de color.
  1041.      En este modo, un color es descrito con una simple
  1042. muestra.  La muestra es usada como un índice al mapa de color
  1043. definido por ColorMap y obtener así el triple RGB definido
  1044. para ese pixel.
  1045. Cuando se usa este valor para PhotometricInterpretation, la
  1046. paleta de color debe de ser suministrada.
  1047. SamplesPerPixel debe valer 1.
  1048.  
  1049. 4 = Máscara de transparencia.
  1050.      Esto significa que la imagen es usada para definir una
  1051. región irregularmente formada de otra imagen en el mismo
  1052. fichero.
  1053. SamplesPerPixel y BitsPerSample deben ser 1.
  1054. Se recomienda usar la compresión PackBits.
  1055. Los bits a 1 definen el interior de la región, los bits 0 el
  1056. exterior de la región. La máscara de transparencia debe tener
  1057. los mismos ImageLength e ImageWidth que la imagen principal.
  1058.      Una aplicación que lea la imagen puede usar la máscara
  1059. para determinar que partes de la imagen visualizará. Los
  1060. pixels de la imagen principal a los que correspondan bits a 1
  1061. en la máscara de transparencia serán visualizados, pero los
  1062. pixels de la imagen a los que correspondan bits a 0 en la
  1063. máscara, no serán visualizados.
  1064.  
  1065. No hay valor por defecto.
  1066. PlanarConfiguration
  1067.  
  1068. Tag     : 284  (11C)
  1069. Tipo    : SHORT
  1070. Longitud: 1
  1071.  
  1072. Expresa el modo en el que los datos de la imagen son
  1073. guardados.
  1074.      1: Los valores de la muestra para cada pixel son
  1075. guardados contiguamente, es decir en un único plano.
  1076. Así, para datos RGB, éstos son guardados RGBRGBRGB... uno tras
  1077. otro.
  1078.  
  1079.      2: Las muestras son guardadas en planos separados.
  1080. Para datos RGB, estos son guardados con las muestras de rojo
  1081. en un plano, las de verde en otro y las de azul en otro.
  1082.  
  1083. Si SamplesPerPixel es 1, PlanarConfiguration es irrelevante, y
  1084. no debe incluirse.
  1085.  
  1086. Por defecto vale 1. 
  1087.  
  1088. Ver también BitsPerSample, SamplesPerPixel.
  1089.  
  1090.  
  1091. ResolutionUnit
  1092.  
  1093. Tag     : 296 (128)
  1094. Tipo    : SHORT
  1095. Longitud: 1
  1096.  
  1097. Indica la unidad usada para medir la resolución.
  1098. Es usada con XResolution e YResolution.
  1099.  
  1100. 1 = No hay unidad de medida.
  1101. 2 = Pulgadas.
  1102. 3 = Centímetros.
  1103.  
  1104. Por defecto vale 2.  
  1105.  
  1106. Ver también XResolution, YResolution.
  1107.  
  1108.  
  1109. RowsPerStrip
  1110.  
  1111. Tag     : 278  (116)
  1112. Tipo    : SHORT o LONG
  1113. Longitud: 1
  1114.  
  1115.      El número de filas por bloque.
  1116. Los datos de la imagen se organizan en bloques para un acceso
  1117. más rápido a filas individuales cuando los datos están
  1118. comprimidos. Este campo es válido incluso si los datos no
  1119. están comprimidos.
  1120. RowsPerStrip e ImageLength juntos indican el número de bloques
  1121. de la imagen. La ecuación es:
  1122.  
  1123.      StripsPerImage=(ImageLength+RowsPerStrip-1)/RowsPerStrip
  1124.  
  1125. asumiendo aritmética de enteros.
  1126.  
  1127.  
  1128.      Por defecto vale 2**32 - 1, que es infinito. Esto es, la
  1129. imagen entera es un bloque. No se recomienda. Debe escogerse
  1130. un RowsPerStrip tal que cada bloque sea de unos 8K bytes. Es
  1131. un tamaño arbitrario pero la práctica demuestra su eficiencia.
  1132.  
  1133. Ver también ImageLength, StripOffsets, StripByteCounts.
  1134.  
  1135.  
  1136. SamplesPerPixel
  1137.  
  1138. Tag     : 277  (115)
  1139. Tipo    : SHORT
  1140. Longitud: 1
  1141.  
  1142.      El número de muestras por pixel. Permite, junto con
  1143. BitsPerSample determinar el espacio que ocupa un pixel.
  1144.      SamplesPerPixel es 1 para imágenes monocromas, escala de
  1145. gris y paleta de color.
  1146.      SamplesPerPixel es 3 para imágenes RGB.
  1147.  
  1148. Por defecto es 1. 
  1149.  
  1150. Ver también BitsPerSample, PhotometricInterpretation.
  1151.  
  1152.  
  1153. StripByteCounts
  1154.  
  1155. Tag     : 279  (117)
  1156. Tipo    : SHORT o LONG
  1157. Longitud:StripsPerImage si PlanarConfiguration vale 1.
  1158.      SamplesPerPixel * StripsPerImage si PlanarConfiguration es 2.
  1159.  
  1160.      Indica, para cada bloque, el número de bytes en cada
  1161. bloque.  La existencia de este campo simplifica el tratamiento
  1162. de buffers cuando los datos están comprimidos si el tamaño del
  1163. bloque es razonable.
  1164.  
  1165. No hay valor por defecto.
  1166.  
  1167. Ver también StripOffsets, RowsPerStrip.
  1168. StripOffsets
  1169.  
  1170. Tag     : 273  (111)
  1171. Tipo    : SHORT o LONG
  1172. Longitud:StripsPerImage si PlanarConfiguration vale 1.
  1173.      SamplesPerPixel * StripsPerImage si PlanarConfiguration es 2.
  1174.  
  1175. Indica para cada bloque el desplazamiento de ese bloque.
  1176. El desplazamiento es especificado con respecto al inicio del
  1177. fichero TIFF.
  1178. Nótese que esto implica que cada bloque tiene una localización
  1179. independiente de las localizaciones de otros bloques. Este
  1180. campo es la única forma que tienen los programas lectores de
  1181. ficheros TIFF para encontrar los datos de la imagen y por
  1182. tanto debe existir.
  1183.  
  1184. No hay valor por defecto.
  1185.  
  1186. Ver también StripByteCounts, RowsPerStrip.
  1187.  
  1188.  
  1189. XResolution
  1190.  
  1191. Tag     : 282  (11A)
  1192. Tipo    : RATIONAL
  1193. Longitud: 1
  1194.  
  1195. El número de pixels por ResolutionUnit en la dirección X.
  1196.  
  1197. No hay valor por defecto.
  1198.  
  1199. Ver también YResolution, ResolutionUnit.
  1200.  
  1201.  
  1202. YResolution
  1203.  
  1204. Tag     : 283  (11B)
  1205. Tipo    : RATIONAL
  1206. Longitud: 1
  1207.  
  1208. El número de pixels por ResolutionUnit en la dirección Y.
  1209.  
  1210. No hay valor por defecto.
  1211.  
  1212. Ver también XResolution, ResolutionUnit.
  1213.     CODIFICACION
  1214.  
  1215.      Una vez vista la estructura de los ficheros TIFF y los
  1216. tags más usados sólo resta saber cuales son los tipos de
  1217. ficheros TIFF más comunes y cómo identificarlos.
  1218.  
  1219.      Como se ha apuntado anteriormente, se han definido 4
  1220. clases de ficheros TIFF:
  1221.  
  1222.      Clase B para imágenes monocromas.
  1223.      Clase G para imágenes de tonos de gris.
  1224.      Clase P para imágenes con paleta de color.
  1225.      Clase R para imágenes RGB de color real.
  1226.  
  1227.      También se define la Clase X para llamarlas a todas de
  1228. forma genérica.
  1229.  
  1230.      Todas las clases poseen unos requerimientos generales y
  1231. otros específicos.
  1232.  
  1233. REQUERIMIENTOS GENERALES
  1234.  
  1235.      Los programas que generan ficheros TIFF pueden estipular
  1236. algunos valores por defecto, pero no es imprescindible.
  1237.      Por otra parte, los programas decodificadores deben estar
  1238. preparados para leer campos (tags) no requeridos.
  1239.      Deben ser capaces de leer en los formatos 'II' y 'MM'.
  1240.      Deben estar preparados para leer ficheros que contienen
  1241. múltiples imágenes. Esto es recomendable pero no obligatorio.
  1242. En estos casos, la primera imagen debe tener la resolución
  1243. máxima. Las siguientes, tales como reducciones y máscaras de
  1244. transparencia pueden estar en cualquier orden. En este estudio
  1245. no se tratan estas subimágenes.
  1246.  
  1247.      Los campos o tags requeridos por los cuatro tipos de
  1248. imágenes son los siguientes:
  1249.  
  1250.     NewSubfileType. LONG.
  1251.     Para permitir múltiples imágenes. Se recomienda pero
  1252.     no es imprescindible, puede ignorarse.
  1253.  
  1254.     ImageWidth. SHORT o LONG.
  1255.     Indica el ancho de la imagen.
  1256.  
  1257.     ImageLength. SHORT o LONG.
  1258.     Indica el alto de la imagen.
  1259.  
  1260.     RowsPerStrip. SHORT o LONG.
  1261.     Permite la carga de la imagen por bloques.
  1262.  
  1263.     StripOffsets. SHORT o LONG.
  1264.     Relacionado también con la lectura de la imagen, ya
  1265.     que indica donde comienzan los bloques de imagen, depende
  1266.     de los campos RowsPerStrip e ImageLength.
  1267.  
  1268.     StripByteCounts. SHORT o LONG.
  1269.     Relacionado con la codificación del fichero, no es
  1270.     estrictamente necesario.
  1271.  
  1272.     XResolution, YResolution. RATIONAL.
  1273.     Su tratamiento depende del tipo de aplicación que
  1274.     trate las imágenes. En nuestro caso no se necesitan tener
  1275.     en cuenta.
  1276.  
  1277.     ResolutionUnit. SHORT.
  1278.     Es recomendable que los lectores puedan ser capaces
  1279.     de manejar las tres posibles unidades de resolución.
  1280.    A continuación se estudian las cuatro clases de TIFF y
  1281. los campos que definen a cada una de ellas, así como los
  1282. valores que los campos deben tener.
  1283.  
  1284. CLASE B. MONOCROMOS.
  1285.  
  1286. TAG                         TIPO              VALOR    COMENTARIO
  1287. SamplesPerPixel            SHORT             1     Por defecto
  1288. BitsPerSample               SHORT             1       1 bit por pixel
  1289. Compression                 SHORT             1       Sin comprimir
  1290.                         2    CCITT
  1291.                         32773   PackBits
  1292. PhotometricInterpretation      SHORT             0
  1293.                         1
  1294.  
  1295.     Como era de esperar los ficheros B utilizan un bit por
  1296. pixel para representar las imágenes. El color representado por
  1297. cada bit depende de la interpretación fotométrica.
  1298.  
  1299. CLASE G. ESCALA DE GRISES.
  1300.  
  1301. TAG                        TIPO          VALOR            COMENTARIO
  1302. SamplesPerPixel            SHORT         1
  1303. BitsPerSample              SHORT         4
  1304.                      8
  1305. Compression                SHORT         1                Sin comprimir
  1306.                      5                LZW
  1307. PhotometricInterpretation  SHORT         0
  1308.                      1
  1309.  
  1310.      Los ficheros de escala de grises, usan un número que
  1311. representa el tono de gris del pixel en una paleta de grises.
  1312. La paleta puede aparecer o no. Los ficheros de este tipo son
  1313. una variación de los de paleta de color. CLASE P. PALETA DE COLORES.
  1314.  
  1315. TAG                        TIPO          VALOR            COMENTARIO
  1316. SamplesPerPixel            SHORT         3                Rojo, Verde y Azul
  1317. BitsPerSample              SHORT         1..8
  1318. Compression                SHORT         1                Sin comprimir
  1319.                      5                LZW
  1320. PhotometricInterpretation  SHORT         3                Paleta de color
  1321. ColorMap                   SHORT         Indice Indice a la paleta
  1322.  
  1323.      Los ficheros de paleta de color, usan un número que
  1324. representa el color del pixel en una paleta de colores RGB.
  1325.   
  1326. CLASE R. COLOR REAL RGB.
  1327.  
  1328. TAG                        TIPO          VALOR            COMENTARIO
  1329. SamplesPerPixel            SHORT         3
  1330. BitsPerSample              SHORT         8
  1331. Compression                SHORT         1                Sin comprimir
  1332.                      5                LZW
  1333. PhotometricInterpretation  SHORT         2                RGB
  1334. PlanarConfiguration        SHORT         1                Contiguo
  1335.                      2                Por planos
  1336.  
  1337.      Los ficheros de color real RGB, usan un trío RGB para
  1338. representar cada pixel. No requieren paleta de colores y la
  1339. información puede venir contiguamente o por planos. 5.2 EL FORMATO PCX (PC PAINTBRUSH)
  1340.  
  1341. GENERALIDADES SOBRE LOS FICHEROS PCX
  1342.  
  1343.      El formato PCX fue desarrollado para uso del programa PC
  1344. Paintbrush, una aplicación de dibujo de la compañía ZSoft. La
  1345. evolución experimentada por el programa (Existe una potente
  1346. versión para el entorno Windows), lo ha convertido en uno de
  1347. los programas de mayor éxito dentro de su ámbito, lo cual ha
  1348. dado lugar a que el formato PCX se haya consolidado como uno
  1349. de los estándares gráficos más usados para el intercambio de
  1350. imágenes entre aplicaciones de este tipo.
  1351.  
  1352. CARACTERISTICAS DE LOS FICHEROS PCX
  1353.  
  1354.      Los ficheros PCX pueden contener una imagen monocromática
  1355. o de color, variando el número de colores desde los 4 de las
  1356. primeras versiones de Paintbrush para CGA hasta los actuales
  1357. ficheros de imágenes de color real (True Color).
  1358.  
  1359. AMBITO DEL ESTUDIO
  1360.  
  1361.      Dado que los sistemas CGA están prácticamente obsoletos y
  1362. el color real requiere de potentes tarjetas de video para su
  1363. visualización, el presente estudio abarcará los ficheros
  1364. monocromos y los de 16 y 256 colores.
  1365.   
  1366. ESTRUCTURA DE UN FICHERO PCX
  1367.  
  1368.      El formato PCX es un formato fijo: la información sobre
  1369. la estructura del gráfico y los datos propios de la imagen se  
  1370. almacenan en campos definidos siempre en la misma posición del
  1371. fichero.
  1372.  
  1373.      Los ficheros PCX tienen una cabecera de 128 bytes en la
  1374. que se encuentra la información del gráfico que incluye una
  1375. paleta de 16 colores. Tras ésta, se encuentran los datos,
  1376. comprimidos según la técnica run-length, que se explicará más
  1377. adelante.   Opcionalmente, si el gráfico soporta 256 colores,
  1378. tras los datos aparece una paleta de 256 colores.
  1379.  
  1380.  
  1381. CABECERA
  1382.  
  1383.      La cabecera presenta la siguiente estructura:
  1384. BYTE TAMAÑO CAMPO                         DESCRIPCION Y CONTENIDO
  1385. 0    1      fabricante                    Cte = 10 (0xA)
  1386. 1    1      versión                       Versión de la imagen:
  1387.                         0: 2.5
  1388.                         2: 2.8 con paleta de color
  1389.                         3: 2.8 sin paleta de color
  1390.                         4: Paintbrush para Windows
  1391.                         5: Versiones 3.0 o posteriores
  1392. 2    1      codificacion                  Cte = 1, compresión run-length
  1393. 3    1      bits_por_pixel                Nº de bits por pixel por plano
  1394. 4    2      xmin                          Coordenada x superior izquierda
  1395. 6    2      ymin                          Coordenada y superior izquierda
  1396. 8    2      xmax                          Coordenada x inferior derecha
  1397. 10   2      ymax                          Coordenada y inferior derecha
  1398. 12   2      ppp_hor                       Resolución horizontal en ppp
  1399. 14   2      ppp_ver                       Resolución vertical en ppp
  1400. 16   48     paleta                        Paleta de colores (hasta 16)
  1401. 64   1      reservado                     No usado
  1402. 65   1      planos_color                  Nº planos de color
  1403. 66   2      bytes_por_línea               Nº de bytes por línea
  1404. 68   2      tipo_paleta                   Interpretación de la paleta:
  1405.                         1: B/N
  1406.                         2: Escala de grises
  1407. 70   58     relleno                       Relleno hasta completar 128 bytes
  1408.  
  1409.  
  1410.      El primer byte (fabricante) es una constante que vale
  1411. siempre 10 (0xA en hexadecimal y sirve para identificar los
  1412. ficheros PCX.
  1413.  
  1414.      El segundo (versión) indica la versión de Paintbrush con
  1415. la que se creó la imagen. Además indica también si se debe o
  1416. no usar la paleta que trae el dibujo. Cuando este byte vale 5,
  1417. Paintbrush  entiende que la paleta está activada y respeta el
  1418. color del gráfico. Si vale 3, se usa la paleta en uso del
  1419. sistema.
  1420.  
  1421.      El tercero (codificación) es una constante de valor uno
  1422. que indica que el gráfico está codificado según una técnica
  1423. run_length orientada a byte que se explicará más adelante.
  1424.  
  1425.      El cuarto byte (bits_por_pixel) indica el numero de bits
  1426. requeridos para representar un pixel.
  1427.  
  1428.      A continuación aparecen cuatro enteros de dos bytes
  1429. (xmin,ymin,xmax,ymax) que representan las esquinas superior
  1430. izquierda e inferior derecha de la imagen en pantalla. Por lo
  1431. general la esquina superior suele ser la (0,0), por lo que la
  1432. esquina inferior indica frecuentemente la altura y ancho de la
  1433. imagen.
  1434.  
  1435.      Los dos enteros siguientes (ppp_hor,ppp_ver) indican la
  1436. resolución de la imagen, en puntos por pulgada, horizontal y
  1437. verticalmente.
  1438.  
  1439.      Los 48 bytes siguientes (paleta) contienen la información
  1440. relativa a la paleta de colores. Esta información se
  1441. interpreta de forma distinta según la tarjeta de vídeo usada.
  1442.      En una tarjeta EGA (16 colores), los datos se almacenan
  1443. como 16 triples de 3 bytes cada uno, cada triple es un valor
  1444. RGB, indicando cada byte del triple la cantidad de rojo, verde
  1445. y azul.
  1446.      En una tarjeta CGA (2 colores), sólo se usa el primer
  1447. byte de cada triple de la siguiente forma: el primer byte del
  1448. primer triple, representa el color de fondo, el cual se halla
  1449. dividiendo el byte sin signo entre 16 para obtener un valor
  1450. entre 0 y 15. El primer byte del segundo triple representa el
  1451. color de la figura. Como Paintbrush soporta 8 paletas CGA, el
  1452. color de la figura se codifica como un número de 0 a 255 con 8
  1453. rangos de números cada 32 (0..31, 32..63,224..255).
  1454.  
  1455.      En una tarjeta VGA (256 colores), la información
  1456. almacenada en esta paleta de 48 bytes no tiene sentido puesto
  1457. que no sirve para guardar una paleta de 256 colores. En este
  1458. caso, la paleta se encuentra situada al final del fichero,
  1459. tras la imagen codificada.
  1460.  
  1461.      Tras la paleta, y continuando con la cabecera, aparece un
  1462. byte que no tiene uso (reservado).
  1463.  
  1464.      El siguiente byte (planos_color) indica el número de
  1465. planos de colores. Conociendo el nº de planos y el nº de bits
  1466. por pixel, se obtiene el nº de colores.
  1467.  
  1468.      Tras el nº de planos aparecen los bytes por línea
  1469. (bytes_por_línea), necesarios para la decodificación de la
  1470. imagen.
  1471.  
  1472.      Para terminar el tipo de paleta (tipo_paleta) expresa si
  1473. la imagen es monocroma o de escala de grises.
  1474.  
  1475.      El resto (relleno) es un relleno hasta completar los 128
  1476. bytes de la cabecera.
  1477.  
  1478. CODIFICACION DE LA IMAGEN
  1479.  
  1480.      La imagen puede venir codificada por pixels o por planos.
  1481.  
  1482.      En el primer caso, los pixels vienen codificados uno tras
  1483. otro hasta completar la línea, por lo que, bastará con leer la
  1484. línea del fichero para obtener la línea de la imagen. Esto
  1485. ocurrirá con las imágenes monocromáticas y de 256 colores.
  1486.  
  1487.      En el segundo, cada línea de la imagen viene codificada
  1488. por planos en el orden RGBI (Rojo, verde, azul e intensidad)
  1489. de la forma siguiente:
  1490.  
  1491. Línea 0:    RRR...
  1492.         GGG...
  1493.         BBB...
  1494.         III...
  1495.  
  1496. Línea 1:        RRR...
  1497.         GGG...
  1498.         BBB...
  1499.         III...
  1500.  
  1501.         ...
  1502.  
  1503.      Por lo que, cada línea leída del fichero, deberá ser
  1504. escrita en su plano correspondiente, siendo necesario leer 4
  1505. líneas de fichero para obtener una línea de la imagen. Este es
  1506. el caso de imágenes de 16 colores que suelen venir codificadas
  1507. de esta forma para acomodarse mejor a la estructura de las
  1508. tarjetas de video EGA y a las VGA en modo 16 colores.
  1509.  
  1510.      El método de compresión usado por los ficheros PCX se
  1511. denomina run-length. Es un método orientado a la compresión a
  1512. nivel de bytes, agrupando sucesiones de bytes iguales en un
  1513. paquete que contiene un contador seguido del dato que se
  1514. repite.
  1515.  
  1516.      El método es el siguiente:
  1517.  
  1518.     PARA cada byte "c" leído del fichero
  1519.         SI los 2 bits más significativos de "c" valen 1
  1520.             contador = 6 bits menos significativos de "c"
  1521.             dato = siguiente byte a "c"
  1522.         SINO
  1523.             contador = 1
  1524.             dato = "c"
  1525.         FINSI
  1526.  
  1527.      Según toda la documentación consultada, los paquetes
  1528. deben ajustarse a la longitud de una línea. No debe aparecer
  1529. un paquete con un contador que sumado al nº de bytes leídos,
  1530. supere la longitud total de bytes de la línea. Sin embargo
  1531. algunos programas de conversión usados durante el desarrollo
  1532. de este estudio, con objeto de generar ficheros más compactos,
  1533. agrupan en un solo paquete tantos bytes como el contador les
  1534. permite (hasta 63) aunque parte de estos bytes pertenezcan a
  1535. la siguiente línea. Este aspecto enrarece un poco el algoritmo
  1536. de descompresión que, antes de tratar una nueva línea, debe
  1537. comprobar si existen bytes pertenecientes a esta línea
  1538. tratados en la anterior. Para resolver esto, se ha recurrido a
  1539. la utilización de variables estáticas que "recuerdan" a la
  1540. función  descompresora de líneas los bytes sobrantes de la
  1541. línea anterior.
  1542.  
  1543. LA PALETA DE 256 COLORES
  1544.  
  1545.      Esta paleta está estructurada de la misma forma que la
  1546. paleta EGA, pero en esta ocasión se trata de 256 triples RGB,
  1547. por lo que se sitúa a partir de la posición -768 contando
  1548. desde el final del fichero. El byte anterior (el -769) debe
  1549. valer 12 y el campo versión de la cabecera debe contener el
  1550. valor 5. 5.3 EL FORMATO MAC (MACPAINT)
  1551.  
  1552.  
  1553. GENERALIDADES SOBRE FICHEROS MAC
  1554.  
  1555.      Los ficheros MAC tiene su origen en los computadores
  1556. Apple Macintosh. Este formato surgió ante la necesidad de
  1557. establecer un puente de comunicación con otros entornos para
  1558. el intercambio de las imágenes.
  1559.  
  1560. CARACTERISTICAS DE LOS FICHEROS MAC
  1561.  
  1562.      Tienen un formato fijo. El tamaño del fichero varía por
  1563. la compresión de los datos, pero todas las imágenes de este
  1564. formato tienen tamaño fijo: 576x720.
  1565.      Son monocromos, lo que implica que cada byte contiene 8
  1566. pixels, por lo que para cada línea se requieren 576/8 = 72
  1567. bytes.
  1568.  
  1569. ESTRUCTURA DE UN FICHERO MAC
  1570.  
  1571.      Los ficheros MAC poseen una cabecera que puede ser de 640
  1572. o 512 bytes seguidos de la imagen codificada según un método
  1573. run-length que se explica más adelante. Al tener su origen en
  1574. los ordenadores Apple Macintosh, estos ficheros contienen los
  1575. números en formato Motorola, en el que los bytes menos
  1576. significativos de una palabra se encuentran en último lugar,
  1577. al contrario que en el formato Intel.
  1578. CABECERA
  1579.  
  1580.      La cabecera estándar de un fichero MAC tiene una longitud
  1581. de 640 bytes y su estructura es la siguiente:
  1582.  
  1583. BYTE TAMAÑO CAMPO                         DESCRIPCION Y CONTENIDO
  1584. 0    1      byte0                         Cte = 0
  1585. 1    1      longitud                      Longitud nombre del fichero (0-31)
  1586. 2    63     nombre                        nombre del fichero
  1587. 65   4      tipo                          Cadena constante = "PNTG"
  1588. 69   4      creador                       Cadena constante = "MPNT"
  1589. 73   10     relleno1                      No usado
  1590. 83   4      tam_datos                     Tamaño de los datos
  1591. 87   4      tam_codigo                    Tamaño del código
  1592. 91   4      fecha_creacion                Fecha de creación
  1593. 95   4      fecha_modifi                  Fecha de modificación
  1594. 99   33     relleno2                      No usado
  1595. 132  304    patrones                      38 patrones de 8 bytes
  1596. 436  204    relleno3                      No usado
  1597.  
  1598.      El primer elemento de la cabecera (byte0) es un byte de
  1599. valor cero.
  1600.  
  1601.      El segundo (longitud) es otro byte que indica la longitud
  1602. del nombre del fichero. Su valor oscila entre 0 y 31.
  1603.  
  1604.      El tercero (nombre) es el nombre del fichero, su longitud
  1605. viene determinada por el contenido del campo anterior. Ocupa
  1606. 63 bytes.
  1607.  
  1608.      El cuarto (tipo) es una constante que identifica el tipo
  1609. de fichero. Su valor es "PNTG".
  1610.  
  1611.      El quinto (creador) indica el origen del fichero. También
  1612. es una constante. Su valor es "MPNT" (MacPaiNT).
  1613.  
  1614.      A continuación aparece un campo reservado (relleno1).
  1615.  
  1616.      El siguiente campo (tam_datos) es un entero de 4 bytes
  1617. que expresa el tamaño de los datos.
  1618.  
  1619.      El séptimo (tam_código) no se usa. debe valer cero.
  1620.  
  1621.      Los dos siguientes campos indican (fecha_creación y
  1622. fecha_modificacion) indican las fechas de creación y última
  1623. modificación del fichero. 
  1624.  
  1625.      Los siguientes 33 bytes (relleno2) no se usan.
  1626.  
  1627.      El penúltimo campo de la cabecera (patrones) agrupa 38
  1628. patrones de 8 bytes cada uno.
  1629.  
  1630.      Al final de la cabecera aparecen 204 bytes para completar
  1631. los 640 bytes (relleno3).
  1632.  
  1633.      Aunque ésta es la cabecera estándar de los ficheros MAC,
  1634. algunos ficheros MAC creados por determinados programas, son
  1635. generados con una cabecera de 512 bytes en blanco, es decir
  1636. con todos sus bytes a cero.
  1637.  
  1638.      Ninguna de las dos cabeceras sirve de mucho a la hora de
  1639. extraer el gráfico, ya que en estos ficheros se sabe de
  1640. antemano toda la información necesaria para hacerlo. Así pues
  1641. puede ignorarse la cabecera, aunque sí es necesario detectar
  1642. de cual de las dos se trata para determinar el comienzo de los
  1643. datos de la imagen.
  1644.  
  1645. CODIFICACION
  1646.  
  1647.      Los fichero MAC usan un método de compresión de bytes
  1648. iguales.
  1649.  
  1650.      El método es el siguiente:
  1651.  
  1652.     Se lee un byte del fichero.
  1653.     Si el bit más significativo de este byte vale 0, se usa
  1654. como contador para indicar cuántos bytes han de leerse del
  1655. fichero como bytes de datos.
  1656.     Si el bit menos significativo vale 1, se le hace el
  1657. complemento a dos y se usa como contador para indicar cuántas
  1658. veces se usará el siguiente byte del fichero como byte de
  1659. dato.
  1660.  
  1661.      El algoritmo de lectura:
  1662.  
  1663.      PARA cada byte "c" leído del fichero
  1664.          SI el bit más significativo de "c" vale 0
  1665.              contador = siguiente byte del fichero
  1666.              MIENTRAS contador > 0
  1667.                  dato = siguiente byte del fichero
  1668.                  contador = contador - 1
  1669.              FIN MIENTRAS
  1670.          SINO ( el bit más significativo de "c" vale 1)
  1671.              contador = complemento a dos de "c"
  1672.              dato = siguiente byte del fichero
  1673.          FINSI
  1674.  
  1675.      Cada línea del fichero debe tener siempre 72 bytes una
  1676. vez descompactada. Esto permite detectar en caso de duda si se
  1677. trata o no de un fichero MAC. 5.4 EL FORMATO IMG/GEM
  1678.  
  1679.      A mediados de los 80 la compañía Digital Research lanzó
  1680. al mercado el entorno gráfico GEM, bajo el cual se hizo
  1681. popular el ya mítico programa de autoedición Ventura
  1682. Publisher. Este programa utilizaba imágenes importadas en
  1683. formato IMG, también diseñado por Digital Research para GEM.  
  1684.  
  1685. CARACTERISTICAS DE LOS FICHEROS IMG
  1686.  
  1687.      Originariamente, los ficheros IMG eran monocromáticos,
  1688. aunque en la actualidad han evolucionado y existen versiones
  1689. de 16 y 256 colores. A pesar de ello, la ausencia de una
  1690. paleta de colores en estos últimos hace que los programas de
  1691. tratamiento de ficheros gráficos le asignen una paleta de
  1692. tonos de grises para su visualización.
  1693.      Existe una versión vectorial y otra bitmap de estos
  1694. ficheros. Esta última es la tratada en este estudio.
  1695.  
  1696. ESTRUCTURA DE UN FICHERO IMG
  1697.  
  1698.      Los ficheros IMG poseen una cabecera de 16 bytes formada
  1699. por 8 enteros de 2 bytes, que se encuentran en formato
  1700. MOTOROLA. Tras la cabecera se encuentra la imagen codificada
  1701. según una técnica especial variante de una compresión RLE. 
  1702.  
  1703. CABECERA
  1704.  
  1705.      La estructura de una cabecera de un fichero IMG es la
  1706. siguiente:
  1707.  
  1708. BYTE TAMAÑO CAMPO                         DESCRIPCION Y CONTENIDO
  1709. 0    2      id1                           Cte = 1
  1710. 2    2      id2                           Cte = 8
  1711. 4    2      planos                        Nº de planos: 1,4 o 8
  1712. 6    2      longitud                      Longitud del patrón: 1
  1713. 8    2      ancho_pixels                  Ancho del pixel en micras
  1714.                         (85 micras = 1/300 pulgadas)
  1715. 10   2      alto_pixels                   Alto del pixel en micras
  1716. 12   2      ancho_linea                   Ancho de la imagen en pixels
  1717. 14   2      alto_imagen                   Alto de la imagen en pixels
  1718.  
  1719.      Es importante recordar que los enteros se encuentran en
  1720. formato MOTOROLA, con los bytes cambiados de orden con
  1721. respecto al formato INTEL.
  1722.  
  1723.      Los dos primeros (id1 e id2) sirven para identificar los
  1724. ficheros IMG. Deben valer 1 y 8 respectivamente. El segundo
  1725. indica también el tamaño de la cabecera en bytes.
  1726.  
  1727.      El tercer entero (planos) indica el número de planos de
  1728. color de la imagen. Si la imagen es monocromática vale 1. Si
  1729. tiene 16 colores, su valor es 4. Por último si posee 256
  1730. colores el campo vale 8.
  1731.  
  1732.      El cuarto entero (longitud) es un número de bytes a
  1733. repetir en el proceso de descompresión de la imagen. Se usa
  1734. cuando se descomprime un 'pattern run'. Se verá más adelante.
  1735.  
  1736.      El quinto y sexto enteros (ancho_pixels y alto_pixels)
  1737. indican el tamaño en micras del pixel en el dispositivo donde
  1738. se creó la imagen. Ninguno de estos campos se usa para nada.
  1739.  
  1740.      El séptimo y octavo (ancho_linea y alto_imagen) indican
  1741. las dimensiones de la imagen.
  1742.  
  1743.  
  1744. CODIFICACION
  1745.  
  1746.      El formato IMG posee 4 variantes de compresión que pueden
  1747. coexistir en un mismo fichero:
  1748.  
  1749. Líneas repetidas (Replication packet).
  1750.      Consiste en la repetición de líneas completas dentro de
  1751. la imagen. Si al leer los tres primeros bytes de la línea
  1752. éstos poseen los valores hexadecimales 00 00 FF, la línea se
  1753. repetirá tantas veces como indique el cuarto byte leído. La
  1754. línea estará a partir del quinto byte.
  1755.  
  1756. Paquete sólido (Solid Run).
  1757.      Cada byte leído tiene un color, blanco o negro que viene
  1758. determinado por el bit de mayor peso de ese byte. Si el bit
  1759. vale 0 el color es blanco y si vale 1 es negro. Los siete bits
  1760. restantes indican el número de veces que hay que repetir el
  1761. color.
  1762.  
  1763. Patrón repetido (Pattern Run).
  1764.      El cuarto byte de la cabecera (longitud) indica la
  1765. longitud que posee el pattern run. Si el byte leído del
  1766. fichero vale 00, el siguiente byte leído indica el número de
  1767. veces que hay que repetir el numero de bytes que indica la
  1768. longitud del pattern run.
  1769.      Ej: Si la secuencia leída es 00 04 07 1A, indica lo
  1770. siguiente:
  1771.      Es un pattern run ya que el primer byte vale 00.
  1772.      El segundo byte es el numero de veces a repetir el
  1773. pattern, en este caso vale 4.
  1774.      Si suponemos que el campo longitud de la cabecera tiene
  1775. el valor 2, entonces hay que repetir 4 veces los 2 siguientes
  1776. bytes del fichero ( 07 1A) con lo que se obtendría la
  1777. secuencia:  07 1A 07 1A 07 1A 07 1A.
  1778.  
  1779. Cadena de bits (Bit String).
  1780.      Si el byte leído del fichero vale 80h, el siguiente byte
  1781. indica el número de bytes que se deben leer para pintarlos en
  1782. la pantalla. Estos bytes no se repiten. En realidad no
  1783. comprime.
  1784.  
  1785.      A la hora de visualizar un fichero IMG hay que tener en
  1786. cuenta dos aspectos:
  1787.  
  1788.      1. Los bytes leídos del fichero no contienen la
  1789. información por pixel, sino por planos.
  1790.  
  1791.      En las imágenes monocromáticas el número de planos es uno
  1792. con lo que cada bit leído representa un pixel.
  1793.  
  1794.      En las imágenes de 16 colores, el número de planos es
  1795. cuatro. Cada línea de la imagen viene codificada por planos en
  1796. el orden RGBI (Rojo, verde, azul e intensidad) de la forma
  1797. siguiente:
  1798.  
  1799. Línea 0:    RRR... 2────────────────────0 Plano Rojo
  1800.         GGG... 2────────────────────0 Plano Verde
  1801.         BBB... 2────────────────────0 Plano Azul
  1802.         III... 2────────────────────0 Plano Intensidad
  1803.         ││└───────────────0 3er pixel de la línea 0
  1804.         │└────────────────0 2º pixel de la  línea 0
  1805.         └─────────────────0 1er pixel de la línea 0
  1806.  
  1807. Línea 1:        RRR... 2────────────────────0 Plano Rojo
  1808.         GGG... 2────────────────────0 Plano Verde
  1809.         BBB... 2────────────────────0 Plano Azul
  1810.         III... 2────────────────────0 Plano Intensidad
  1811.         ││└───────────────0 3er pixel de la línea 1
  1812.         │└────────────────0 2º pixel de la  línea 1
  1813.         └─────────────────0 1er pixel de la línea 1
  1814.  
  1815.  
  1816.      Por lo que, cada línea leída del fichero, deberá ser
  1817. escrita en su plano correspondiente, siendo necesario leer 4
  1818. líneas de fichero para obtener una línea de la imagen. Este es
  1819. el modo en el que funciona la tarjeta EGA ( o la VGA en modo
  1820. EGA) por lo que la línea se escribirá tal y como se lee del
  1821. fichero.    En las imágenes de 256 colores, el número de planos es
  1822. ocho. Cada línea de la imagen viene codificada por planos de
  1823. la forma siguiente:
  1824.  
  1825. Línea 0:    000... 2────────────────────0 Plano 0
  1826.         111... 2────────────────────0 Plano 1
  1827.         222...           .
  1828.         333...           .
  1829.         444...           .
  1830.         555...           .
  1831.         666...           .
  1832.         777... 2────────────────────0 Plano 7
  1833.         ││└───────────────0 3er pixel de la línea 0
  1834.         │└────────────────0 2º pixel de la  línea 0
  1835.         └─────────────────0 1er pixel de la línea 0
  1836.  
  1837. Línea 1:        000... 2────────────────────0 Plano 0
  1838.         111... 2────────────────────0 Plano 1
  1839.         222...           .
  1840.         333...           .
  1841.         444...           .
  1842.         555...           .
  1843.         666...           .
  1844.         777... 2────────────────────0 Plano 7
  1845.         ││└───────────────0 3er pixel de la línea 1
  1846.         │└────────────────0 2º pixel de la  línea 1
  1847.         └─────────────────0 1er pixel de la línea 1
  1848.  
  1849.     Por lo que, cada línea leída del fichero, deberá ser
  1850. transformada, tomando para formar cada pixel un bit de cada
  1851. plano, hasta 8, como indica la figura anterior.
  1852.  
  1853.      2. Los ficheros IMG no poseen paleta de colores por lo
  1854. que hay que asignarles una paleta por defecto, normalmente se
  1855. les aplica una paleta de grises. 5.5 EL FORMATO BMP (WINDOWS)
  1856.  
  1857. GENERALIDADES SOBRE FICHEROS BMP
  1858.  
  1859.      El formato BMP es el estándar usado por Windows 3.X como
  1860. fichero de intercambio de bitmaps.
  1861.  
  1862. CARACTERISTICAS DE LOS FICHEROS BMP
  1863.  
  1864.      Los ficheros BMP pueden ser en la actualidad de tres
  1865. tipos: Monocromos, 16 colores y 256 colores.
  1866.      No poseen ningún método de compresión, aunque existe una
  1867. versión posterior conocida como RLE que sí lo usa. 
  1868.  
  1869. ESTRUCTURA DE UN FICHERO BMP
  1870.  
  1871.      Estos ficheros poseen una cabecera de 56 bytes. A
  1872. diferencia de otros formatos como PCX, IMG, TGA, etc, los
  1873. campos de la cabecera son casi siempre enteros de 4 bytes.
  1874.      Tras ella puede aparecer una paleta de colores de
  1875. longitud variable. Para cada color de la paleta, aparecen
  1876. cuatro bytes que definen los niveles de Azul, Verde, Rojo e
  1877. Intensidad.
  1878.      Por último aparece la imagen codificada línea a línea sin
  1879. comprimir. Para cada pixel de la imagen se requieren 1, 4 u 8
  1880. bits, según el número de colores.
  1881.                                                                                                          CABECERA
  1882.  
  1883.      La cabecera de un fichero BMP presenta la siguiente
  1884. estructura:
  1885.  
  1886. BYTE TAMAÑO CAMPO                         DESCRIPCION Y CONTENIDO
  1887. 0    2      tipo                          Tipo de fichero, cte = "BM"
  1888. 2    4      longitud                      Longitud del fichero en bytes
  1889. 6    4      reservados                    Reservados, no se usan
  1890. 10   4      inicio                        Posición del fichero donde empieza
  1891.                         la imagen
  1892. 14   4      tam                           Cte = 40
  1893. 18   4      ancho                         Ancho en pixels
  1894. 22   4      alto                          Alto en pixels
  1895. 26   2      planos                        Numero de planos, cte = 1
  1896. 28   2      bitspixel                     Bits por pixel:
  1897.                         1: Imagen monocroma
  1898.                         4: 16 colores
  1899.                         8: 256 colores
  1900. 32   4      compresión                    Indica compresión. Cte = 0, no compr.
  1901. 36   4      tamimagen                     Tamaño de la imagen, no se usa
  1902. 40   4      x                             Extremo izquierdo, suele ser cero
  1903. 44   4      y                             Extremo superior, suele ser cero
  1904. 48   4      colores                       Indica la presencia o no de paleta
  1905. 52   4      usados                        No se usa
  1906.  
  1907.      El primer campo de la cabecera (tipo) es una cte que
  1908. identifica los ficheros BMP.
  1909.  
  1910.      El segundo (longitud) indica la longitud total del
  1911. fichero en bytes.
  1912.  
  1913.      El tercero (reservado es un campo reservado.
  1914.  
  1915.      El cuarto (inicio) indica la posición en la que empiezan
  1916. los datos de la imagen.
  1917.  
  1918.      El siguiente (tam) es una cte = 40.
  1919.  
  1920.     Los dos siguientes (ancho y alto) indican las dimensiones
  1921. de la imagen.
  1922.  
  1923.      A continuación aparecen los planos por pixel (planos) y
  1924. los bits por pixel (bitspixel).
  1925.  
  1926.      El siguiente (compresión) indica si la imagen está
  1927. comprimida o no. Esta versión no admite compresión.
  1928.  
  1929.      A continuación aparece el tamaño de la imagen en pixels
  1930. (tamimagen).
  1931.  
  1932.      Los dos siguientes (x e y) indican en extremo superior
  1933. izquierdo de la imagen.
  1934.  
  1935.      El penúltimo campo (colores) indica la existencia de una
  1936. paleta de colores. Si vale 0, hay paleta.
  1937.  
  1938.      El ultimo campo (usados) se ignora.
  1939.  
  1940. CODIFICACION
  1941.  
  1942.      Como se ha indicado anteriormente, no se usa ningún
  1943. criterio de compresión aunque la información no se encuentra
  1944. codificada de la misma forma para cada tipo de fichero.
  1945.  
  1946.      Para los ficheros monocromos, se usa un bit por pixel.
  1947.  
  1948.      010110 ...
  1949.      ││└───────────────0 3er pixel
  1950.      │└────────────────0 2º pixel
  1951.      └─────────────────0 1er pixel
  1952.  
  1953.      Para los de 16 colores, 4 bits por pixel.
  1954.  
  1955.      11010010 ...
  1956.      ││││└┴┴┴────────0 2º pixel
  1957.      └┴┴┴────────────0 1er pixel
  1958.  
  1959.      Para los de 256 colores, 8 bits por pixel. 5.6 EL FORMATO TGA (TARGA)
  1960.  
  1961.      La extensión TGA, se corresponde con los ficheros TARGA,
  1962. un formato definido por TrueVision. Este formato es utilizado
  1963. por un elevado número de aplicaciones para almacenamiento e
  1964. intercambio de imágenes y no sólo en el ámbito de los PCs,
  1965. también es usado por otras plataformas especializadas en el
  1966. tratamiento de gráficos.
  1967.  
  1968. CARACTERISTICAS DE LOS FICHEROS TGA
  1969.  
  1970.      Las imágenes que usan este formato varían desde las
  1971. monocromáticas hasta las de 24 o 32 bits de profundidad de
  1972. color. 
  1973.      Los ficheros TGA pueden estar o no comprimidos. En el
  1974. segundo caso, el método de codificación usado se denomina RLE.
  1975.  
  1976. AMBITO DEL ESTUDIO
  1977.  
  1978.      Los ficheros TGA objeto del estudio son los
  1979. monocromáticos y de mapa de color (hasta 256 colores) sin
  1980. codificar.
  1981.     
  1982. ESTRUCTURA DE UN FICHERO TGA
  1983.  
  1984.      Los ficheros TGA poseen una cabecera de 18 bytes. Tras la
  1985. cabecera aparece, si existe, la paleta de colores que en lugar
  1986. de estar codificada en formato RGB, aparece invertida (BGR). A
  1987. continuación aparece la imagen que puede venir codificada en
  1988. la forma RLE.
  1989.  
  1990.      Opcionalmente los ficheros TGA pueden incluir un área de
  1991. desarrollador, un área de extensión, una tabla de corrección
  1992. de colores y un pie. Estas áreas son usadas para ampliar la
  1993. información de la imagen. No serán incluidas en el estudio del
  1994. formato por ser meramente informativas.
  1995.  
  1996.  
  1997. CABECERA
  1998.  
  1999. BYTE TAMAÑO CAMPO        DESCRIPCION Y CONTENIDO
  2000. 0    1      longitud            Longitud del campo de identificación de la
  2001.                 imagen, que se encuentra en el byte 10+cabecera
  2002. 1    1      mapa_color          Presencia o no de paleta de colores
  2003. 2    1      tipo_imagen         Tipo de imagen:
  2004.                 0: No hay datos
  2005.                 1: Mapa de color, sin comprimir
  2006.                 2: Color real, sin comprimir
  2007.                 3: B/N, sin comprimir
  2008.                 9: Mapa de color, compresión RLE
  2009.                 10: Color real, compresión RLE
  2010.                 11: B/N, compresión RLE
  2011. 3    2      indice_mapa         Indice a la paleta de colores
  2012. 5    2      entradas_mapa       Nº entradas de la paleta
  2013. 7    1      tam_color           Tamaño de cada definición de color (8,24 o 32)
  2014. 8    2      inf_izda_hor        Columna esquina inferior izquierda
  2015. 10   2      inf_izda_ver        Fila esquina inferior izquierda
  2016. 12   2      ancho               Anchura en pixels de la imagen
  2017. 14   2      alto                Altura en pixels de la imagen
  2018. 16   1      prof_color_pixel    Profundidad de color por pixel
  2019. 17   1      orden               bits 7, 6 = 0
  2020.                 bits 5, 4: orden de transferencia
  2021.                     00: inferior izquierda
  2022.                     01: inferior derecha
  2023.                     10: superior izquierda
  2024.                     11: superior derecha
  2025.                 bits 3 a 0: nº bits de atributos por pixel
  2026.  
  2027.      El primer byte (longitud) contiene la longitud del campo
  2028. de identificación de la imagen, que se encuentra en el byte
  2029. 10+cabecera.
  2030.  
  2031.      El segundo (mapa_color) indica la presencia (1) o no (0)
  2032. de paleta de color.
  2033.  
  2034.      El tercero (tipo_imagen) indica el tipo de la imagen. Se
  2035. refiere a si la imagen es monocromática, de mapa de colores
  2036. (RGB) o de color real (True Color). Además indica si la imagen
  2037. está comprimida o no.   
  2038.  
  2039.      A continuación un entero de dos bytes (indice_mapa)
  2040. indica, en caso de existir, el lugar del fichero en el que se
  2041. encuentra la paleta de colores.
  2042.  
  2043.      Tras este, otro entero (entradas_mapa) indica el número
  2044. de colores que tiene la paleta.
  2045.  
  2046.      El séptimo byte (tam_color) indica el tamaño en bits de
  2047. cada definición de color. 
  2048.  
  2049.      A continuación dos enteros de dos bytes (inf_izda_hor y
  2050. inf_izda_ver) indican las coordenadas x e y de la esquina
  2051. inferior izquierda de la imagen.
  2052.  
  2053.      Otros dos enteros (ancho y alto) indican el tamaño en
  2054. pixels de la imagen.
  2055.  
  2056.      A continuación un byte indicador de la profundidad de
  2057. color por pixel (prof_color_pixel). Esto representa el número
  2058. de bits requeridos para representar el color de un pixel.
  2059.  
  2060.      El último byte de la cabecera (orden) agrupa tres
  2061. informaciones:
  2062.  
  2063.      Los bits 7 y 6 deben valer cero (0).
  2064.      Los bits 5 y 4 indican el orden en el que los pixels
  2065. deberán ser transferidos a la pantalla, para ello se establece
  2066. el siguiente patrón:
  2067.  
  2068.      00 : Inferior izquierda
  2069.      01 : Inferior derecha
  2070.      10 : superior izquierda
  2071.      11 : superior derecha
  2072.  
  2073.      Los bits 3 a 0 indican el número de bits de atributos por
  2074. pixel.
  2075.  
  2076. LA PALETA DE COLORES
  2077.  
  2078.      Se trata de tantos triples BGR como colores tenga la
  2079. imagen. La presencia de la paleta viene determinada por el
  2080. byte 1 de la cabecera.
  2081.  
  2082. CODIFICACION
  2083.  
  2084.      Los ficheros capaces de ser leídos por la aplicación son
  2085. los monocromos y los de hasta 256 colores (24 bits de tamaño
  2086. de color y 8 bits de profundidad de color por pixel) sin
  2087. codificar.
  2088.      Así pues, para la lectura de los datos de la imagen,
  2089. basta con leer línea a línea el número de bytes requeridos
  2090. para cada una de ellas. 
  2091. 5.7 EL FORMATO GIF (Graphics Interchange Format)
  2092.  
  2093. GENERALIDADES SOBRE LOS FICHEROS GIF
  2094.  
  2095.      El formato GIF fue desarrollado en 1987 por Compuserve,
  2096. creándose entonces la versión 87a. En 1989 se añadieron unas
  2097. extensiones al formato dando lugar a la versión 89a.
  2098.  
  2099. CARACTERISTICAS DE LOS FICHEROS GIF
  2100.  
  2101.      Los ficheros GIF permiten almacenar imágenes de hasta 256
  2102. colores. Pueden incluirse varias imágenes en un solo fichero,
  2103. así como información relativa a las mismas. Lo más destacable
  2104. de este formato es el grado de compresión que puede llegar a
  2105. obtenerse gracias al uso de una versión modificada del
  2106. algoritmo LZW.
  2107.  
  2108. AMBITO DEL ESTUDIO
  2109.  
  2110.      En este estudio, se han implementado las rutinas
  2111. necesarias para visualizar cualquier tipo de fichero GIF,
  2112. reconociendo las extensiones de la versión 89a. Esta
  2113. extensiones no son tratadas. También se incluyen las rutinas
  2114. de compresión (desarrollada en ensamblador) y escritura de
  2115. imágenes GIF.   ESTRUCTURA DE UN FICHERO GIF
  2116.  
  2117.      La estructura general es la siguiente:
  2118. ┌────────────────────────┐
  2119. │ Identificador GIF      │
  2120. ├────────────────────────┤
  2121. │Descriptor de pantalla  │
  2122. ├────────────────────────┤
  2123. │Paleta de color global  │
  2124. ├────────────────────────┤
  2125. │Extensión (0 o varias)  │
  2126. ├────────────────────────┤
  2127. │Descriptor de la imagen │
  2128. ├────────────────────────┤
  2129. │Paleta de color local   │
  2130. ├────────────────────────┤
  2131. │Datos imagen (LZW)      │
  2132. ├────────────────────────┤
  2133. │           .            │
  2134. │           .            │
  2135. │           .            │
  2136. ├────────────────────────┤
  2137. │Extensión (0 o varias)  │
  2138. ├────────────────────────┤
  2139. │Descriptor de la imagen │
  2140. ├────────────────────────┤
  2141. │Paleta de color local   │
  2142. ├────────────────────────┤
  2143. │Datos imagen (LZW)      │
  2144. ├────────────────────────┤
  2145. │Marca de fin de fichero │
  2146. └────────────────────────┘
  2147.  
  2148.      El identificador de fichero GIF es una cadena de 6
  2149. caracteres cuyo contenido es 'GIF87a' o 'GIF89a' dependiendo
  2150. de la versión. Para leer el fichero es bastante detectar los 3
  2151. primeros bytes.
  2152.  
  2153.      Los campos descriptor de pantalla y la paleta de color
  2154. global se conocen como datos globales. Hacen referencia al
  2155. dispositivo donde se crea o visualiza la imagen.
  2156.  
  2157.      Las extensiones son comentarios acerca de las imágenes.
  2158. Pueden omitirse. Se añadieron en el año 1989, dando así lugar
  2159. a la versión 89a, última conocida hasta el momento.
  2160.  
  2161.      Los campos descriptor de imagen, paleta local y datos son
  2162. los llamados datos locales y son los que se repiten en caso de
  2163. que existan múltiples imágenes en el fichero GIF 
  2164.  
  2165.      Por último la marca de fin de fichero es el carácter
  2166. punto y coma (;).
  2167. DATOS GLOBALES
  2168.  
  2169.      El descriptor de pantalla es un conjunto de campos cuya
  2170. estructura se muestra a continuación:
  2171.  
  2172. ┌────────────────────────┐
  2173. │Ancho de pantalla       │
  2174. ├────────────────────────┤
  2175. │Alto de pantalla        │
  2176. ├────────────────────────┤
  2177. │Registro de flags local │
  2178. ├────────────────────────┤
  2179. │Color de fondo          │
  2180. ├────────────────────────┤
  2181. │Byte 0                  │
  2182. └────────────────────────┘
  2183.  
  2184. Los datos del descriptor se organizan del siguiente modo:
  2185.  
  2186. BYTE TAMAÑO CAMPO                         DESCRIPCION Y CONTENIDO
  2187. 0    2      ancho_pantalla                Ancho de la pantalla
  2188. 2    2      alto_pantalla                 Alto de la pantalla
  2189. 4    1      bandera_global                Registro formado por varias
  2190.                         banderas o flags:
  2191.                         Bits 0 a 2 (pixel).
  2192.                         Bit 3: Reservado.
  2193.                         Bits 4 a 6 (cr).
  2194.                         Bit 7 (M).
  2195. 5    1      color_fondo                   Color de fondo
  2196. 6    1      cero                          No usado. Debe ser cero
  2197.  
  2198.      Los dos primeros campos (ancho_pantalla y alto_pantalla)
  2199. definen la resolución en pixels de la pantalla.
  2200.  
  2201.      El tercer campo (bandera global) es un registro de 8 bits
  2202. que hace referencia al color.
  2203.  
  2204. Bits 0 a 2 (pixel):
  2205.      Incrementados en 1, indican el número de bits por
  2206. pixel.Además 1 << (bits por pixel) indica el número de
  2207. colores.
  2208.  
  2209. Bit 3: Reservado debe ser cero.
  2210.  
  2211. Bits 4 a 6 (cr):
  2212.      Incrementados en 1, indican el numero de bits por color.
  2213. Bit 7 (M):
  2214.      Si es 0, no hay paleta global
  2215.      Si es 1, hay paleta global
  2216.  
  2217.      El cuarto campo (color_fondo) se usa como color de fondo.
  2218.  
  2219.      El último byte (cero) no se usa.
  2220.  
  2221.      Si existe la paleta de color global, ésta viene
  2222. codificada en triples RGB de tres bytes, uno para cada
  2223. componente. Existirán tantos triples como colores tenga la
  2224. imagen. 
  2225.  
  2226.  
  2227. EXTENSIONES
  2228.  
  2229.      Como se ha dicho anteriormente, las extensiones son
  2230. bloques meramente informativos acerca de la(s) imagen(es)
  2231. contenidas en el fichero. Su presencia no es obligatoria y
  2232. puede eludirse su tratamiento.
  2233.  
  2234.      Existen cuatro tipos de extensiones (control,
  2235. comentarios, texto y aplicación) y todas ellas utilizan la
  2236. misma estructura:
  2237.  
  2238.      Identificador: es una constante de un byte. Identifica el
  2239. comienzo de una extensión. Su valor es (!).
  2240.  
  2241.      Tipo: es un byte que indica el tipo de extensión.
  2242.  
  2243.      Longitud: otro byte que indica el número de bytes que
  2244. ocupa la extensión.
  2245.  
  2246.      Datos: Son tantos bytes como indique el campo longitud.
  2247. Contiene la información.
  2248.  
  2249.      Fin: Byte de terminación de la extensión, siempre cero. Extensiones de control.
  2250.  
  2251.      Se utilizan para controlar la visualización de ficheros
  2252. con múltiples subimágenes y se aplican únicamente a la primera
  2253. de ellas, indicando al programa visualizador si debe esperar
  2254. después de mostrar la primera subimagen. La extensión debe
  2255. localizarse antes de la subimagen. Su estructura es la
  2256. siguiente:
  2257.  
  2258.      Identificador: es una constante de un byte. Identifica el
  2259.      comienzo de una extensión. Su valor es (!).
  2260.  
  2261.      Tipo: Tipo de extensión. F9 en hexadecimal.
  2262.  
  2263.      Longitud: 4.
  2264.  
  2265.      Banderas: Un registro de 8 bits:
  2266.          Bits 5 a 7: reservados, deben ser cero.
  2267.          Bits 2 a 4: indican como borrar la imagen. Hay
  2268.          cuatro valores posibles:
  2269.             00: no hay método específico.
  2270.             01: dejar la imagen en pantalla.
  2271.             10: Borrarla con el color de fondo.
  2272.             11: Borrar y dejar la imagen previa.
  2273.          Bit 1: si es 1, esperar evento (pulsación de tecla o
  2274.          clic de ratón) para borrar la imagen.
  2275.          Bit 0: Si es uno, usar índice de transparencia.
  2276.  
  2277.      Retraso: valor de 16 bits que indica el retardo en
  2278.      centésimas de segundo que debe esperar el visor antes de
  2279.      borrar la imagen. Puede usarse junto con el bit uno del
  2280.      registro banderas.
  2281.  
  2282.      Transparencia. Byte que indica el índice de
  2283.      transparencia. Si el bit 0 del registro de banderas vale
  2284.      1, el color indicado por este byte no debe dibujarse en
  2285.      pantalla, dejando lo que había antes de mostrar la
  2286.      imagen.
  2287.  
  2288.      Fin: Byte de terminación de la extensión, siempre cero.
  2289. Extensiones de comentarios.
  2290.  
  2291.      Se usan para añadir información textual a los archivos.
  2292. Informan sobre el autor, el título, etc. Es un texto ASCII que
  2293. puede incluir retornos de carro. Su estructura es la
  2294. siguiente:
  2295.  
  2296.      Identificador: es una constante de un byte. Identifica el
  2297. comienzo de una extensión. Su valor es (!).
  2298.  
  2299.      Tipo: Tipo de extensión. FE en hexadecimal.
  2300.  
  2301.      Texto: Bloques de texto de longitud 1 a 255 bytes,
  2302.      precedidos de un byte que indica la longitud del bloque.
  2303.  
  2304.      Fin: Byte de terminación de la extensión, siempre cero.
  2305.  
  2306. Extensiones de texto.
  2307.  
  2308.      Se usan para añadir textos a las imágenes. El visor debe
  2309. tener la capacidad de dibujar los textos en modo gráfico. Se
  2310. suponen los caracteres del mismo ancho. Su estructura es:
  2311.  
  2312.      Identificador: es una constante de un byte. Identifica el
  2313.      comienzo de una extensión. Su valor es (!).
  2314.  
  2315.      Tipo: Tipo de extensión. 01 en hexadecimal.
  2316.  
  2317.      Longitud: 12.
  2318.  
  2319.      X0: Esquina izquierda donde comienza el texto. 2 bytes.
  2320.  
  2321.      Y0: Esquina superior donde comienza el texto. 2 bytes.
  2322.  
  2323.      AnchoTexto: Ancho del rectángulo en pixels. 2 bytes.
  2324.  
  2325.      AltoTexto: Alto del rectángulo en pixels. 2 bytes.
  2326.  
  2327.      AnchoCaracter: Ancho de cada carácter en pixels. 1 byte.
  2328.  
  2329.      AltoCaracter: Alto de cada carácter en pixels. 1 byte.
  2330.  
  2331.      ColorTexto: Un byte, indica el color del texto.
  2332.  
  2333.      ColorFondo: Un byte, indica el color de fondo del texto.
  2334.  
  2335.      Texto: Bloques de texto de longitud de 1 a 255 bytes,
  2336.      precedidos de un byte que indica la longitud de cada
  2337.      bloque.
  2338.  
  2339.      Fin: Byte de terminación de la extensión, siempre cero.
  2340.  
  2341. Extensiones de aplicación.
  2342.  
  2343.      Informan específicamente sobre la aplicación que creó el
  2344. fichero. Su estructura es:
  2345.  
  2346.      Identificador: es una constante de un byte. Identifica el
  2347.      comienzo de una extensión. Su valor es (!).
  2348.  
  2349.      Tipo: Tipo de extensión. FF en hexadecimal.
  2350.  
  2351.      Longitud: 11.
  2352.  
  2353.      IdAplicacion: 8 bytes que contienen una cadena de 8
  2354.      caracteres que identifican la aplicación que creó el GIF.
  2355.  
  2356.      Código: Código de comprobación de la autenticidad de la
  2357.      aplicación. Cada aplicación debe proveer un algoritmo que
  2358.      genere o compruebe el código. Tiene 3 bytes de longitud.
  2359.  
  2360.      Datos: Datos de la aplicación, dependen de cada una.
  2361.  
  2362.      Fin: Byte de terminación de la extensión, siempre cero.
  2363.  
  2364. DATOS LOCALES
  2365.  
  2366.      El bloque descriptor de la imagen presenta la siguiente
  2367. estructura:
  2368.  
  2369. BYTE TAMAÑO CAMPO               DESCRIPCION Y CONTENIDO
  2370. 0    1      coma                Cte = carácter coma (,)
  2371. 1    2      x0                  Coordenada izquierda de inicio de la imagen
  2372. 3    2      y0                  Coordenada superior de inicio de la imagen
  2373. 5    2      ancho               Ancho de la imagen
  2374. 7    2      alto                Alto de la imagen
  2375. 9    1      bandera local       Registro formado por varias banderas o flags:
  2376.                     Bits 0 a 2 (pixel)
  2377.                     Bits 3 a 5: Reservados deben valer 0.
  2378.                     Bit 6: (I)
  2379.                     Bit 7: (M)
  2380.  
  2381.      El ultimo campo (bandera local) es un registro de 8 bits
  2382. que hace referencia al color y al orden de las líneas.
  2383.  
  2384. Bits 0 a 2 (pixel):
  2385.      Incrementados en 1, indican el número de bits por pixel.
  2386.      Además 1 << (bits por pixel) indica el número de colores.
  2387.  
  2388. Bits 3 a 5: Reservados, deben ser cero.
  2389.  
  2390. Bit 6 (I):
  2391.      Si es cero, las líneas son consecutivas.
  2392.      Si es uno, están en modo entrelazado.
  2393.  
  2394. Bit 7 (M):
  2395.      Si es 0, no hay paleta local, usar la global.
  2396.      Si es 1, hay paleta local.
  2397.  
  2398.      Si existe la paleta de color local, ésta viene codificada
  2399. en triples RGB de tres bytes, uno para cada componente.
  2400. Existirán tantos triples como colores tenga la imagen. 
  2401.  
  2402.      Los datos de la imagen vienen comprimidos por el método
  2403. LZW, que se explica más adelante, en el apartado codificación.
  2404. La imagen puede estar dispuesta de modo secuencial, esto es,
  2405. una línea tras otra o bien en modo entrelazado. En el modo
  2406. entrelazado las líneas vienen dispuestas de la siguiente
  2407. manera:
  2408.  
  2409.      Las primeras líneas del fichero se corresponden con las
  2410. líneas 8, 16, 24, 32,... (en incrementos de 8) hasta completar
  2411. la imagen.
  2412.  
  2413.      A continuación se encuentran las líneas 5, 13, 21,...
  2414. (incrementos de 8) hasta completar la imagen  .
  2415.  
  2416.      En tercer lugar se disponen las líneas 3, 7, 11,... (en
  2417. incrementos de 4) hasta el final.
  2418.  
  2419.      Por último se encuentran las líneas 2, 4, 6,... (en
  2420. incrementos de 2).
  2421.    Así pues, el proceso para visualizar las imágenes se
  2422. dividirá en cuatro pasos. En el siguiente ejemplo se muestran,
  2423. para una imagen de 16 líneas, las correspondencias entre las
  2424. líneas del fichero y el lugar que ocupan en la pantalla, así
  2425. como el paso en el que son llevadas a la pantalla:
  2426.  
  2427. Lín.fichero    Lín.imagen   Paso
  2428. 1              1            1
  2429. 2              9            4
  2430. 3              5            3
  2431. 4              10           4
  2432. 5              3            2
  2433. 6              11           4
  2434. 7              6            3
  2435. 8              12           4
  2436. 9              2            1
  2437. 10             13           4
  2438. 11             7            3
  2439. 12             14           4
  2440. 13             4            2
  2441. 14             15           4
  2442. 15             8            3
  2443. 16             16           4
  2444.  
  2445.      En la implementación realizada, debido a la gestión de
  2446. memoria usada, no se siguen estos cuatro pasos, es más rápido
  2447. llevar cada línea de fichero a su posición en la pantalla en
  2448. cuanto es descomprimida. CODIFICACION
  2449.  
  2450. COMPRESION DE FICHEROS GIF
  2451.  
  2452.      Los ficheros GIF usan una versión modificada del
  2453. algoritmo de compresión LZW usado por programas de dominio
  2454. público de compresión de ficheros tales como ARC, PKARC o
  2455. PKZIP. Este método divide la imagen en pequeños paquetes, cada
  2456. uno de un determinado tamaño. El final de la imagen se indica
  2457. con un paquete que contiene cero bytes de datos.
  2458.      Cada paquete consiste en un "byte índice" seguido de
  2459. hasta 255 bytes de datos comprimidos. El byte índice indica
  2460. cuantos bytes contiene el paquete. Si el índice de un paquete
  2461. es 255, el paquete tendrá una longitud total de 256 bytes. El
  2462. ultimo paquete será un byte índice con valor cero.
  2463.      Para reducir el tamaño de los datos, el algoritmo
  2464. convierte las líneas de datos en series de tokens o códigos
  2465. que ocuparán menos espacio que los datos originales.
  2466.  
  2467.      El algoritmo maneja tres elementos mientras trabaja:
  2468.  
  2469. - Los datos de entrada, llamado stream de caracteres.
  2470. - Los tokens o códigos de salida, llamado stream de código.
  2471. - La tabla de strings, usada para la conversión entre los
  2472. dos anteriores elementos.
  2473.  
  2474.      Un fichero GIF es codificado con hasta 12 bits de
  2475. compresión. Estos doce bits permiten representar valores desde
  2476. 0 hasta 4096, por lo que la tabla de strings contendrá como
  2477. máximo este número de entradas.
  2478.      Asumiendo que la imagen pueda tener 256 colores, el
  2479. proceso de compresión se iniciará inicializando las 256
  2480. primeras posiciones de la tabla con los valores del 0 al 255.
  2481. Estos valores representan entradas únicas e indivisibles de la
  2482. tabla y el valor de cada entrada coincidirá con su
  2483. localización en la tabla. Ninguna de las siguientes entradas
  2484. tendrá esta propiedad.
  2485.      Una vez hecho esto, el programa buscará el primer
  2486. carácter de la entrada (el stream de caracteres) en la tabla.
  2487. Para ello usará dos buffers: El prefijo actual y el string
  2488. actual. Ambos están vacíos al comienzo. El string actual se
  2489. define siempre como el prefijo actual más el siguiente
  2490. carácter del stream de caracteres.
  2491.      Cuando el programa coge el primer carácter del stream, el
  2492. string actual es igual al prefijo, que está vacío, más el
  2493. carácter. En definitiva, la primera vez el string es igual al
  2494. primer carácter. El programa busca entonces el string en la
  2495. tabla. Por definición, este string debe estar presente en la
  2496. tabla, ya que esta última ha sido inicializada con todos los
  2497. posibles valores de un byte. Por ello, el programa copiará el
  2498. string en el prefijo y repetirá el proceso, añadiendo el
  2499. siguiente carácter del stream al string. Ahora el string
  2500. tendrá dos bytes de longitud.
  2501.      El programa buscará este nuevo string en la tabla sin
  2502. encontrarlo, ya que no existen entradas de dos bytes. En ese
  2503. momento se creará una nueva entrada en la tabla con el valor
  2504. del string. Esta entrada será la 256, ya que desde la 0 a la
  2505. 255 estaban ya ocupadas. Tras esto se envía el número 256 al
  2506. stream de códigos (la salida).
  2507.      El proceso se repetirá hasta que todos los datos de la
  2508. entrada sean procesados.
  2509.  
  2510.      Hay que hacer dos adiciones para los ficheros GIF:
  2511.  
  2512. - La primera de ellas es que, cada cierto tiempo, un
  2513. código especial de borrado es enviado. Esto indica al
  2514. decodificador que reinicialice su tabla de strings. Se ha de
  2515. enviar cuando el codificador decide que la tabla está llena.
  2516. Este código se define como el número máximo de colores de la
  2517. imagen (256 en este caso).
  2518.  
  2519. - La segunda es un código de final de imagen y se define
  2520. como uno más que el código de borrado. Si una imagen tiene 200
  2521. líneas, el codificador enviará a la salida 201, empezando la
  2522. última línea con éste código y sin contener datos.
  2523.  
  2524.      Debido a estos dos códigos extra, la adición de nuevos
  2525. códigos a la tabla se realizará desde las dos siguientes
  2526. posiciones al último código inicializado en la misma.
  2527.  
  2528. DESCOMPRESION DE FICHEROS GIF
  2529.  
  2530.      Para realizar la descompresión o decodificación de un
  2531. fichero GIF, el stream de caracteres se convierte en la salida
  2532. y el stream de códigos se constituye como entrada. Igualmente
  2533. el programa usará una tabla de strings que se inicializa al
  2534. principio con los posibles valores. Se definen el código
  2535. actual y el código anterior. El código actual comienza siendo
  2536. el primer código de entrada del stream de códigos.
  2537.      El programa empieza buscando el primer código en la tabla
  2538. y lo encontrará. Mandará el string de la tabla al stream de
  2539. caracteres y copiará este código en el código anterior.
  2540.      Ahora tomará el primer carácter del string que ha enviado
  2541. a la salida y lo añadirá al prefijo actual. La primera vez el
  2542. prefijo contiene sólo este carácter. Añadirá este string a la
  2543. tabla y copiará el código anterior en el actual. Este proceso
  2544. se repetirá.
  2545.      En algún momento, el programa tomará un código del stream
  2546. que no esté en la tabla, al igual que el programa codificador
  2547. tomó un string que no estaba en la tabla durante el proceso de
  2548. compresión. Este código deberá ser el siguiente en la tabla,
  2549. después de todos los conocidos. Como el primer carácter de
  2550. este string ya está en la tabla, el programa trabajará ahora
  2551. con el contenido del nuevo string, representado por este nuevo
  2552. código y formado por el string anterior más un carácter nuevo.
  2553. 6 ESTRUCTURAS DE DATOS. REPRESENTACION DE LAS IMAGENES.
  2554.  
  2555.      Este capítulo está dedicado a la estructura de datos
  2556. usada para el almacenamiento de las imágenes en memoria así
  2557. como a la representación de las imágenes en función del tipo
  2558. de memoria usada para su almacenamiento y el modo de video
  2559. usado para su visualización. Es sin duda el capítulo más
  2560. importante, ya que todas las operaciones realizadas sobre las
  2561. imágenes la estructura y modos de almacenamiento y
  2562. visualización explicados a continuación.
  2563.  
  2564.  
  2565. 6.1 LA ESTRUCTURA DE DATOS.
  2566.  
  2567.      La estructura de datos para el almacenamiento temporal de
  2568. la imagen en memoria introducida en el capítulo 4 debe cubrir
  2569. todas las necesidades requeridas para la definición de una
  2570. imagen. Debe ser capaz de guardar la imagen y la información
  2571. relativa a ella, pero siempre desde una óptica objetiva,
  2572. evitando vincularla a ningún formato gráfico concreto.
  2573.  
  2574.      Partiendo de estas premisas, la aplicación define la
  2575. siguiente estructura estándar de la imagen:
  2576.  
  2577. ┌──────────┐
  2578. │Cabecera  │
  2579. ├──────────┤
  2580. │Imagen    │
  2581. └──────────┘
  2582.  
  2583.      Obsérvese el paralelismo entre la estructura adoptada y
  2584. la práctica totalidad de los formatos gráficos que se estudian
  2585. en esta obra.
  2586.  
  2587.      La cabecera estándar de la imagen posee los siguientes
  2588. campos:
  2589.  
  2590.  
  2591. BYTE TAMAÑO CAMPO      DESCRIPCION Y CONTENIDO
  2592. 0    80     nombre     Nombre del fichero en el disco
  2593. 80   2      formato    Formato gráfico de origen
  2594. 82   2      modo       Modo gráfico de visualización
  2595. 84   2      ancho      Ancho en pixels de la imagen
  2596. 86   2      alto       Alto en pixels de la imagen
  2597. 88   2      colores    Número de colores de la imagen
  2598. 90   2      bytes      Bytes por línea
  2599. 92   1      haypaleta  Campo lógico que indica la presencia o no
  2600.                de paleta de colores propia de la imagen
  2601. 93   132    mem        Gestor de memoria de los datos de la imagen
  2602. 225  768    paleta     Paleta de 256 colores
  2603.  
  2604.      El primer campo (nombre) es una cadena de 80 caracteres
  2605. que almacena el nombre del fichero en el disco.
  2606.  
  2607.      El segundo (formato) es un entero que indica el formato
  2608. original de la imagen:
  2609.  
  2610.      0 : MACPAINT.
  2611.      1 : PCX.
  2612.      2 : GIF.
  2613.      3 : TIFF.
  2614.      4 : IMG.
  2615.      5 : TGA.
  2616.      6 : BMP.
  2617.      7 : OTRO.
  2618.  
  2619.      El tercer campo (modo) indica el modo gráfico en el que
  2620. la imagen debe ser visualizada. El modo está en consonancia
  2621. con la manera en que la imagen se almacena en la memoria como
  2622. bitmap. Los modos son:
  2623.  
  2624.      0 : VIDEOmono. Mapa de bits monocromo.
  2625.      1 : VIDEOega. Mapa de bits 16 colores.
  2626.      2 : VIDEOvga. Mapa de bits 256 colores.
  2627.  
  2628.      Los dos siguientes enteros (ancho y alto) indican las
  2629. dimensiones de la imagen en pixels.
  2630.  
  2631.      A continuación (colores) se indica el número de colores o
  2632. grises de la imagen.
  2633.  
  2634.      El séptimo campo (bytes) indica el número de bytes
  2635. requerido para almacenar una imagen.
  2636.      Para imágenes monocromáticas, se requiere un bit por cada
  2637. pixel. Para imágenes EGA, 4 bits por pixel. Las imágenes VGA
  2638. requieren un byte por pixel.
  2639.  
  2640.      El octavo campo (haypaleta) es un byte que indica si
  2641. existe o no paleta de colores.
  2642.  
  2643.      0 : Sin paleta.
  2644.      1 : Con paleta.
  2645.  
  2646.      El siguiente campo (mem) es un gestor de la memoria en la
  2647. que se encuentra la imagen.
  2648.      Ya se adelantó en el capítulo 3 que el programa almacena
  2649. los datos de la imagen usando tres posibles modelos de
  2650. memoria: EMS, XMS y 'memoria virtual' (que llamaremos VMS).
  2651.  
  2652.      El campo mem de la cabecera admite tres posibles
  2653. contenidos según la memoria que esté usando el programa:
  2654.  
  2655.      Para EMS, el campo contiene:
  2656.  
  2657.      tabla: puntero de tipo entero a una tabla de líneas*2
  2658.      enteros que guarda, para cada línea de la imagen, la
  2659.      página de memoria EMS y el desplazamiento dentro de la
  2660.      página donde se encuentra almacenada la línea.
  2661.  
  2662.      gestor: entero usado como manejador de memoria EMS.
  2663.  
  2664.      Para XMS:
  2665.  
  2666.      un entero, que es el manejador de memoria XMS.
  2667.  
  2668.      Para VMS o 'memoria virtual':
  2669.  
  2670.      gestor: Es un puntero al fichero del disco usado como
  2671.      'memoria virtual'.
  2672.  
  2673.      fichero: Cadena de 128 caracteres en la que se guarda el
  2674.      nombre del fichero de 'memoria virtual'.
  2675.  
  2676.  
  2677.      La gestión de los distintos tipos de memoria para el
  2678. almacenamiento de las imágenes se detalla más adelante en el
  2679. apartado de representación de las imágenes según el tipo de
  2680. memoria.
  2681.      El último campo (paleta) almacena una paleta de colores
  2682. (si existe) de 2 a 256 colores. Cada color se guarda con tres
  2683. bytes, uno para cada componente RGB.
  2684. 6.2 REPRESENTACION DE LAS IMAGENES.
  2685.  
  2686.      Una vez vista la estructura diseñada para guardar las
  2687. imágenes se procederá a describir como se van a almacenar
  2688. éstas en la memoria.
  2689.  
  2690.      Este estudio se va ha realizar desde dos puntos de vista
  2691. completamente diferentes:
  2692.  
  2693.      El primero de ellos es el modo de almacenamiento de la
  2694. imagen según el tipo de memoria utilizado.
  2695.  
  2696.      El segundo es el modo de almacenamiento según el modo de
  2697. visualización usado.
  2698.  
  2699. 6.2.1 SEGUN EL TIPO DE MEMORIA.
  2700.  
  2701.      Existen cuatro procesos comunes para el almacenamiento de
  2702. las imágenes sea cual sea la memoria utilizada.
  2703.  
  2704.      1. Reservar memoria.
  2705.         Todas las imágenes necesitan reservar un área de
  2706.      memoria en la que alojarse. La cantidad de memoria a
  2707.      reservar dependerá del tamaño que ocupe la imagen. Este
  2708.      proceso es imprescindible, y debe realizarse antes que
  2709.      ningún otro. Si no hay espacio suficiente para albergar
  2710.      la imagen, ésta no podrá ser procesada. El hecho de
  2711.      reservar memoria para la imagen lleva consigo el conocer
  2712.      el lugar reservado para la imagen.
  2713.  
  2714.      2. Escribir imagen en memoria.
  2715.         Consiste en el almacenamiento de la imagen en el
  2716.      área reservada para ella. Esta escritura se realizará
  2717.      línea a línea desde un buffer de memoria convencional. La
  2718.      escritura de cada línea en el lugar adecuado será posible
  2719.      gracias al paso previo de localización y reserva del
  2720.      espacio de la imagen, que permite conocer el lugar donde
  2721.      se alojará la línea.
  2722.  
  2723.      3. Leer imagen desde la memoria.
  2724.         Es el proceso contrario al anterior. La lectura se
  2725.      realizará línea a línea desde la memoria a un buffer
  2726.      temporal. La lectura de la línea adecuada es posible
  2727.      gracias al proceso previo de reserva de espacio, que
  2728.      permite conocer el lugar donde se aloja la línea.
  2729.  
  2730.      4. Liberar memoria.
  2731.         Una vez que la imagen ha sido tratada con algún fin,
  2732.      debe procederse a la liberación de la memoria reservada
  2733.      previamente, con objeto de que ese espacio quede
  2734.      disponible para ser usado por una nueva imagen. La
  2735.      omisión de este proceso dará lugar a la imposibilidad de
  2736.      cargar nuevas imágenes.
  2737.         A continuación se detallan estos cuatro procesos para
  2738.      cada uno de los tres tipos de memoria utilizados.
  2739.  
  2740.  
  2741. 6.2.1.1 MEMORIA EMS.
  2742.  
  2743.      1. Reservar memoria.
  2744.         Cuando se trata de memoria EMS, la reserva de
  2745.      memoria para la imagen consiste en calcular el número de
  2746.      páginas EMS necesario para guardar la imagen y,
  2747.      reservarla. Además, se reserva memoria convencional para
  2748.      crear una tabla de dos dimensiones en la que se guarda la
  2749.      posición de cada línea en la memoria EMS. La tabla
  2750.      contiene para cada línea el número de página y el
  2751.      desplazamiento dentro de ésta. La reserva de memoria EMS
  2752.      se hace a través de un servicio de la interrupción 67H,
  2753.      con lo que se obtiene un gestor de memoria que permite
  2754.      diferenciar entre la memoria que se ha reservado ahora y
  2755.      la que pudieran estar usando otros procesos. Una vez más
  2756.      debe insistirse en la necesidad de que el driver de
  2757.      memoria EMS debe haber sido previamente instalado[14]. En
  2758.      la aplicación, se usa el EMM386.EXE suministrado con el
  2759.      DOS. En el disquete del programa se incluye el fichero
  2760.      CONFIG.EMS que puede ser renombrado como config.sys para
  2761.      ejecutar el programa usando memoria EMS.
  2762.  
  2763.      2. Escribir imagen en memoria.
  2764.         La escritura de las líneas de la imagen se realiza
  2765.      escribiendo en la página adecuada el buffer de la línea.
  2766.      La página y el desplazamiento se encuentran en la entrada
  2767.      de la tabla correspondiente a la línea a escribir. Si la
  2768.      página no se encuentra en el marco de página EMS, se
  2769.      realiza el proceso de mapeado de páginas físicas y
  2770.      lógicas y, la página correspondiente se situará en el
  2771.      marco de página.
  2772.  
  2773.      3. Leer imagen desde la memoria.
  2774.         La lectura de las líneas de la imagen se realiza
  2775.      escribiendo en el buffer de la línea (en memoria
  2776.      convencional) la línea guardada en la memoria EMS. La
  2777.      página y el desplazamiento se encuentran en la entrada de
  2778.      la tabla correspondiente a la línea a leer. Si la página
  2779.      no se encuentra en el marco de página EMS, se realiza el
  2780.      proceso de mapeado de páginas físicas y lógicas y, la
  2781.      página correspondiente se situará en el marco de página.
  2782.  
  2783.  
  2784.      4. Liberar memoria.
  2785.         El proceso de liberación de la memoria EMS conlleva
  2786.      la liberación de la memoria convencional ocupada por la
  2787.      tabla y la de la propia memoria EMS.
  2788.  
  2789.      Las operaciones relativas al manejo de memoria EMS se
  2790. encuentran en el módulo de la aplicación del mismo nombre y
  2791. son llamadas desde el módulo MEMORIA.
  2792. 6.2.1.2 MEMORIA XMS.
  2793.  
  2794.      1. Reservar memoria.
  2795.         Cuando se trata de memoria XMS, la reserva de
  2796.      memoria para la imagen consiste en calcular el número de
  2797.      bloques de 1Kb de XMS necesario para guardar la imagen y,
  2798.      reservarla. Al reservar la memoria XMS, se obtiene un
  2799.      gestor de memoria que permite diferenciar entre la
  2800.      memoria que se ha reservado ahora y la que pudieran estar
  2801.      usando otros procesos. No se requiere el uso de tabla
  2802.      alguna como en el caso de la memoria EMS, ya que la
  2803.      imagen se almacenará de forma continua. Las operaciones
  2804.      de transferencia de datos entre la memoria convencional y
  2805.      la XMS se realizan pasando al driver de memoria XMS un
  2806.      bloque de información con la siguiente estructura:
  2807.  
  2808. CAMPO        DESCRIPCION
  2809. longitud     Longitud a transferir en bytes
  2810. fuente       Manejador de memoria origen
  2811. desp_fuente  Desplazamiento de la memoria origen
  2812. destino      Manejador de la memoria destino
  2813. desp_destino Desplazamiento de la memoria destino
  2814.  
  2815.      Al igual que en el caso de la memoria EMS, el driver
  2816.      de memoria XMS debe haber sido previamente instalado. En
  2817.      la aplicación, se usa el HIMEM.SYS suministrado con el
  2818.      DOS[14]. En el disquete del programa se incluye el fichero
  2819.      CONFIG.XMS que puede ser renombrado como config.sys para
  2820.      ejecutar el programa usando memoria XMS.
  2821.  
  2822.      2. Escribir imagen en memoria.
  2823.         Para escribir una línea de la imagen en memoria
  2824.         extendida desde un buffer de memoria convencional, los
  2825.         campos de la estructura deben contener los siguientes
  2826.         valores:
  2827.  
  2828.      longitud: número de bytes de la línea.
  2829.      fuente: cero (0).
  2830.      desp_fuente: El puntero al buffer convertido a long.
  2831.      destino: manejador de memoria XMS.
  2832.      desp_destino: desplazamiento de la línea en la imagen.
  2833.  
  2834.      3. Leer imagen desde la memoria.
  2835.         Para leer una línea de la imagen desde la memoria
  2836.      extendida a un buffer de memoria convencional, los campos
  2837.      de la estructura deben contener los siguientes valores:
  2838.  
  2839.      longitud: número de bytes de la línea.
  2840.      fuente: manejador de memoria XMS.
  2841.      desp_fuente: desplazamiento de la línea en la imagen.
  2842.      destino: cero (0).
  2843.      desp_destino: El puntero al buffer convertido a long.
  2844.  
  2845.      4. Liberar memoria.
  2846.         El proceso de liberación de la memoria XMS se
  2847.      realiza con una llamada al driver de memoria extendida.
  2848.  
  2849.      Las operaciones relativas al manejo de memoria XMS se
  2850. encuentran en el módulo de la aplicación del mismo nombre y
  2851. son llamadas desde el módulo MEMORIA. 6.2.1.3 MEMORIA VMS.
  2852.  
  2853.      1. Reservar memoria.
  2854.         Cuando se trata de 'memoria virtual', la reserva de
  2855.      memoria para la imagen consiste en calcular el número de
  2856.      bytes necesario para guardar la imagen para,
  2857.      posteriormente, crear y abrir un fichero temporal del
  2858.      tamaño suficiente. La reserva conlleva la obtención de un
  2859.      puntero al fichero que será usado para la lectura y
  2860.      escritura de la imagen.
  2861.  
  2862.      2. Escribir imagen en memoria.
  2863.         La escritura de una línea de la imagen se realiza
  2864.      calculando el desplazamiento de ésta dentro del fichero y
  2865.      moviendo el puntero del mismo hacia la posición correcta,
  2866.      escribiendo en ella la línea contenida en el buffer.
  2867.  
  2868.      2. Leer imagen desde la memoria.
  2869.         La lectura de una línea de la imagen se realiza
  2870.      calculando el desplazamiento de ésta dentro del fichero y
  2871.      moviendo el puntero del mismo hacia la posición correcta,
  2872.      leyendo en el buffer desde dicha posición.
  2873.  
  2874.      4. Liberar memoria.
  2875.         El proceso de liberación de la 'memoria virtual'
  2876.      supone el cierre y borrado del fichero temporal usado
  2877.      como 'memoria virtual'.
  2878.  
  2879.      Las operaciones relativas al manejo de 'memoria virtual'
  2880. se encuentran en el módulo de la aplicación VMS y son llamadas
  2881. desde el módulo MEMORIA.
  2882. 6.2.2 SEGUN EL MODO DE VISUALIZACION.
  2883.  
  2884.      La manera en que los bytes se organizan para guardar una
  2885. imagen en memoria varía según su número de colores y el modo
  2886. de visualización de la misma. Las imágenes tratadas en este
  2887. estudio pueden dividirse en tres tipos: 
  2888.  
  2889. - Monocromas, blanco y negro. 1 bit por pixel.
  2890. - Hasta 16 colores. 4 bits por pixel.
  2891. - Hasta 256 colores. 8 bits por pixel.
  2892.  
  2893.      Por otro lado los modos de visualización son también
  2894. tres:
  2895. - Monocromo, para imágenes de 2 colores (VIDEOmono). Se
  2896. representan en un plano, con 1 bit por pixel.
  2897.  
  2898. - EGA, para imagenes de hasta 16 colores (VIDEOega). Se
  2899. representan en 4 planos, con 4 bits por pixel, uno por
  2900. cada plano.
  2901.  
  2902. - VGA, para imágenes de hasta 256 colores (VIDEOvga). Se
  2903. representan en un plano, con ocho bits por pixel.
  2904.  
  2905.      Visto esto, puede construirse una tabla que permita
  2906. conocer los modos posibles de visualización de cada imagen:
  2907.  
  2908. MODO DE VIDEO
  2909.             MONOCROMO  EGA  VGA
  2910. Monocroma                   SI     SI   SI
  2911. Hasta 16 colores            NO     SI   SI
  2912. Hasta 256 colores           NO     NO   SI
  2913.  
  2914.     Lógicamente y en relación al modo usado, lo ideal es
  2915. guardar la imagen en memoria de manera que su visualización (y
  2916. en general todas las operaciones a realizar sobre ella) sea lo
  2917. más inmediata posible.
  2918.      Dicho esto, se describen ahora los tres modos de
  2919. almacenamiento y visualización de las imágenes.
  2920. 6.2.2.1 MODO MONOCROMO.
  2921.  
  2922.      Para guardar una imagen monocroma se precisa un bit para
  2923. almacenar cada pixel. Si el bit correspondiente a un pixel es
  2924. cero, el color será negro mientras que si el bit vale uno, el
  2925. color será blanco.
  2926.  
  2927.      Las líneas se almacenarán secuencialmente, requiriéndose
  2928. un número de bytes por línea suficiente para guardar 8 pixels
  2929. en cada byte. Una línea monocroma será como sigue:
  2930.  
  2931.     10111010 ...
  2932.     ││└─────────────── 3er pixel
  2933.     │└──────────────── 2º pixel
  2934.     └───────────────── 1er pixel
  2935.  
  2936.      La visualización de una imagen organizada de esta forma
  2937. en el modo MONOCROMO es inmediata, basta con copiar la
  2938. información tal y como está, en la memoria de vídeo.
  2939. 6.2.2.2 MODO EGA.
  2940.  
  2941.      Para almacenar una imagen EGA de hasta 16 colores se
  2942. precisan 4 bits para almacenar cada pixel. Esto es así porque
  2943. con 24 combinaciones se obtienen las 16 tonalidades posibles.
  2944.      Los 4 bits que definen cada pixel se toman como un índice
  2945. o entrada a la paleta de color. El color indicado en la paleta
  2946. será el color del pixel.
  2947.  
  2948.      La memoria de vídeo en el modo EGA se organiza en cuatro
  2949. planos, de manera que cada uno de los cuatro bits que forman
  2950. un pixel deberá escribirse en el plano correspondiente.
  2951.      Para guardar una organización lo más acorde con el modo
  2952. de operación EGA, las líneas también se almacenan
  2953. secuencialmente, pero en esta ocasión cada línea se divide en
  2954. cuatro partes. Cada una guarda un bit de cada pixel, el
  2955. correspondiente a cada plano.
  2956.  
  2957.      En realidad una línea EGA estará formada por cuatro
  2958. sublíneas consecutivas, cada una de las cuales contiene la
  2959. información de cada plano. Así la primera sublínea pertenece
  2960. al primer plano, la segunda al segundo plano y así para las
  2961. cuatro sublíneas. Cada línea se almacena como sigue:
  2962.  
  2963.      1ª sublínea, guarda los bits para el 1er plano
  2964.      011010 ...
  2965.      ││└─────────────── 1er bit del 3er pixel
  2966.      │└──────────────── 1er bit del 2º pixel
  2967.      └───────────────── 1er bit del 1er pixel
  2968.  
  2969.      2ª sublínea, guarda los bits para el 2º plano
  2970.      111000 ...
  2971.      ││└─────────────── 2º bit del 3er pixel
  2972.      │└──────────────── 2º bit del 2º pixel
  2973.      └───────────────── 2º bit del 1er pixel
  2974.  
  2975.      3ª sublínea, guarda los bits para el 3er plano
  2976.      010110 ...
  2977.      ││└─────────────── 3er bit del 3er pixel
  2978.      │└──────────────── 3er bit del 2º pixel
  2979.      └───────────────── 3er bit del 1er pixel
  2980.  
  2981.      4ª sublínea, guarda los bits para el 4º plano
  2982.      100100 ...
  2983.      ││└─────────────── 4º bit del 3er pixel
  2984.      │└──────────────── 4º bit del 2º pixel
  2985.      └───────────────── 4º bit del 1er pixel
  2986.  
  2987.      Para visualizar las imágenes organizadas de esta manera
  2988. en el modo EGA, se procederá a escribir cada sublínea en su
  2989. plano correspondiente, con el debido desplazamiento dentro de
  2990. éste según la línea de que se trate. 6.2.2.3 MODO VGA.
  2991.  
  2992.      Para almacenar una imagen VGA de hasta 256 colores se
  2993. precisan 8 bits para almacenar cada pixel. Esto es así porque
  2994. con 28 combinaciones se obtienen las 256 tonalidades posibles.
  2995.      Los 8 bits que definen cada pixel se toman como un índice
  2996. o entrada a la paleta de color. El color indicado en la paleta
  2997. será el color del pixel.
  2998.  
  2999.      Las líneas se almacenarán secuencialmente, requiriéndose
  3000. un número de bytes por línea igual al número de pixels. Una
  3001. línea VGA será como sigue:
  3002.  
  3003.     1101001010111010...
  3004.     ││││││││└┴┴┴┴┴┴┴ 2º pixel
  3005.     └┴┴┴┴┴┴┴──────── 1er pixel
  3006.  
  3007.  
  3008.      La visualización de una imagen organizada de esta forma
  3009. en el modo VGA es inmediata, basta con copiar la información
  3010. tal y como está, en la memoria de vídeo.
  3011.  
  3012.      El hecho de poder representar una imagen en más de un
  3013. modo de visualización requiere de un tratamiento a nivel de
  3014. bits que transforme la imagen almacenada en la memoria. Las
  3015. funciones para realizar estas transformaciones y gestionar
  3016. todo lo relacionado con la tarjeta gráfica se encuentran en el
  3017. módulo VIDEO. 7 EL TRATAMIENTO DE LAS IMAGENES.
  3018.  
  3019.      Una vez conocida la organización de las imágenes en
  3020. memoria, ha llegado el momento de conocer las distintas
  3021. operaciones que la aplicación puede realizar sobre ellas.
  3022.      Para ello, se distinguen tres tipos de operaciones
  3023. principales: conversión de formato, transformación e
  3024. impresión.
  3025.  
  3026.  
  3027. 7.1 CONVERSION DE FORMATOS.
  3028.  
  3029.      La conversión de una imagen entre formatos distintos
  3030. requiere cargar en memoria la imagen grabada en el formato
  3031. original para, posteriormente, visualizarla y grabarla de
  3032. nuevo en disco con el formato de salida deseado.
  3033.  
  3034.  
  3035. 7.1.1 CARGA DE IMAGENES.
  3036.  
  3037.      La carga de una imagen en cualquier formato implica
  3038. primeramente detectar que efectivamente el fichero que guarda
  3039. la imagen pertenece a dicho formato gráfico.
  3040.      El siguiente paso es reservar memoria para la cabecera
  3041. estándar de la imagen (definida en el capítulo 6) y rellenarla
  3042. de acuerdo con la información dada por el fichero.
  3043.      Posteriormente se reserva memoria para la imagen en sí
  3044. (expandida, extendida o 'virtual').
  3045.      Por último y de acuerdo con las especificaciones del
  3046. formato se procede a la carga de la imagen desde el disco a la
  3047. memoria. La imagen será almacenada usando uno de los tres
  3048. modos gráficos explicados en el capítulo anterior.
  3049.  
  3050.      En ocasiones la imagen se encuentra codificada de forma
  3051. distinta a como se almacena en memoria y muchas veces
  3052. comprimida para ocupar menos espacio en disco. Es tarea de
  3053. cada uno de los módulos dedicados a cada formato el
  3054. decodificar y/o descomprimir la imagen para adecuarla al modo
  3055. de almacenamiento y visualización usado.
  3056.  
  3057.  
  3058. 7.1.2 VISUALIZACION DE IMAGENES.
  3059.  
  3060.      La visualización de la imagen es un proceso inmediato a
  3061. la carga de la misma en la memoria. Ya se ha visto en el
  3062. capítulo 6 como se organiza la memoria de vídeo para actuar de
  3063. acuerdo al modo seleccionado.
  3064.      La visualización de la imagen tiene tres pasos:
  3065.  
  3066.      El primero consiste en la activación del modo gráfico en
  3067. el que la imagen se va a visualizar.
  3068.      En segundo lugar, se precisa establecer la paleta de
  3069. colores de la imagen como paleta del sistema.
  3070.      El último paso supone la lectura de los datos de la
  3071. imagen desde la memoria de almacenamiento y su escritura en la
  3072. memoria de pantalla.
  3073.  
  3074.      Es posible cambiar el modo de visualización de la imagen.
  3075. Para ello se crea una nueva estructura en memoria y se reserva
  3076. el espacio necesario para guardar la imagen resultante. El
  3077. algoritmo para cambiar el modo de la imagen tomará como origen
  3078. la imagen original y actuará sobre ella, escribiendo la imagen
  3079. resultante en la nueva estructura. Una vez terminado el
  3080. proceso, la imagen original será eliminada y liberada su
  3081. memoria.
  3082.  
  3083.      En ocasiones el tamaño de la imagen puede superar el área
  3084. de pantalla, por lo que se hace necesaria la implementación de
  3085. un panning, técnica que consiste en mostrar un área de la
  3086. imagen y permitir al usuario moverse sobre la imagen con las
  3087. teclas del cursor. En realidad lo que se hace es pintar áreas
  3088. parciales de la imagen en la pantalla tomando las coordenadas
  3089. adecuadas según la tecla pulsada.
  3090.  
  3091.      El módulo VIDEO se encarga de todas las operaciones
  3092. relacionadas con la visualización de las imágenes.
  3093.  
  3094.  
  3095. 7.1.3 GRABACION DE IMAGENES.
  3096.  
  3097.      La grabación de una imagen en un formato determinado
  3098. consiste en elaborar a partir de la cabecera estándar las
  3099. estructuras propias de cada formato para especificar las
  3100. características de la imagen en el fichero destino y, una vez
  3101. hecho esto, esta información y los datos de la imagen se
  3102. graban en el fichero.
  3103.      En ocasiones la imagen ha de codificarse de forma
  3104. distinta a como se almacena en memoria y muchas veces
  3105. comprimirse para ocupar menos espacio en disco. Es tarea de
  3106. cada uno de los módulos dedicados a cada formato el codificar
  3107. y/o comprimir la imagen.
  3108. 7.2 TRANSFORMACION DE IMAGENES.
  3109.  
  3110.      Bajo el epígrafe de transformación de imágenes se van a
  3111. tratar algunas operaciones que se pueden realizar sobre las
  3112. mismas. Estas operaciones son:
  3113.  
  3114.      Escalado.
  3115.      Giro o Reflejo.
  3116.      Conversión a tonos de gris.
  3117.      Conversión a blanco y negro (dithering).
  3118.      Obtención de negativos.
  3119.      Escalado del número de colores.
  3120.  
  3121.  
  3122. 7.2.1 ESCALADO DE IMAGENES.
  3123.  
  3124.      El escalado de una imagen consiste en la ampliación o
  3125. reducción del tamaño de la misma.
  3126.  
  3127.      El escalado se realiza atendiendo a un factor de
  3128. escalado. En la aplicación se define un factor de escala para
  3129. el ancho y otro para el alto, de tal manera que la imagen
  3130. puede reducirse o ampliarse en uno u otro sentido.
  3131.  
  3132.      Los factores se han definido del 0 al 200, de tal manera
  3133. que un factor de 100 equivale a la imagen actual (100%). Si se
  3134. emplea un factor superior a 100, la imagen será ampliada. Por
  3135. el contrario, si el factor es inferior a 100, la imagen será
  3136. reducida. Por poner algún ejemplo, si usamos un factor de 50
  3137. para el ancho y el alto, la imagen se verá reducida a la
  3138. mitad. Si se emplea un factor de 170 para el ancho y de 100
  3139. para el alto, la imagen se 'estirará' a lo ancho.
  3140.  
  3141.      Para escalar una imagen se calcula en primer lugar la
  3142. memoria necesaria para almacenar la imagen resultante y se
  3143. reservan una nueva cabecera estándar y la memoria para
  3144. albergar la imagen.
  3145.  
  3146.      La reducción consistirá en la eliminación del número de
  3147. pixels necesario para la obtención de una imagen del
  3148. porcentaje indicado en el factor de escala. Los pixels se
  3149. multiplicarán por el factor dividido por 100.
  3150.      La ampliación consistirá en la repetición del número de
  3151. pixels necesario para la obtención de una imagen del
  3152. porcentaje indicado en el factor de escala. Los pixels se
  3153. dividirán por el factor dividido por 100.
  3154.  
  3155.      El algoritmo de escalado tomará la imagen original y la
  3156. transformará escribiendo los resultados en la nueva
  3157. estructura. Una vez concluido el proceso, la imagen original
  3158. será eliminada y liberada su memoria. 7.2.2 REFLEJO DE IMAGENES.
  3159.  
  3160.      El reflejo de una imagen consiste en el intercambio de
  3161. los pixels horizontal o verticalmente, como si de un espejo se
  3162. tratara.
  3163.  
  3164.      Para ello no se requiere reservar espacio para la imagen
  3165. destino, ya que la operación se realiza directamente sobre la
  3166. imagen. 
  3167.  
  3168.      El reflejo horizontal es un proceso sumamente sencillo
  3169. cuando se trata de imágenes VGA, ya que basta con intercambiar
  3170. los bytes de cada línea. El primero será el último, el segundo
  3171. será el penúltimo, etc.
  3172.      Cuando se trata de imágenes monocromas además de cambiar
  3173. los bytes de sitio, debe invertirse el orden de los bits de
  3174. cada byte.
  3175.      Para imágenes EGA, deben cambiarse los bytes de sitio e
  3176. invertirse los bits de cada byte para cada uno de los cuatro
  3177. planos (las cuatro sublíneas) de la línea. 
  3178.  
  3179.      El reflejo vertical es muy simple en todos los casos,
  3180. basta con intercambiar el orden de las líneas. La primera será
  3181. la última, la segunda será la penúltima, etc. Basta con leer
  3182. de la memoria los pares de líneas y escribirlos cambiados de
  3183. sitio. 7.2.3 CONVERSION A GRIS Y A BLANCO Y NEGRO.
  3184.  
  3185.      Como ya se adelantó en el apartado 3.1.4 en lo relativo a
  3186. la impresión de imágenes de color en dispositivos de blanco y
  3187. negro, se exponen ahora las soluciones a esta problemática.
  3188.  
  3189.      Representar en blanco y negro una imagen de color puede
  3190. parecer en un principio un problema insuperable; sin embargo,
  3191. esto no es así, la fotografía, una de las tecnologías visuales
  3192. más antiguas lo ha estado haciendo durante más de un siglo.
  3193. Una fotografía en blanco y negro, reduce a tonos de grises la
  3194. imagen en color.
  3195.      Otra técnica, la de la industria periodística, ha estado
  3196. reduciendo las escalas de grises a fotograbados (halftones).
  3197. Esta técnica consiste en representar cada color con un patrón
  3198. de halftone, constituido por puntos blancos y negros. Esta
  3199. técnica no resulta práctica a la hora de representar imágenes
  3200. de una gama considerable de colores. Por ejemplo, para
  3201. representar una imagen de 256 colores se requiere para cada
  3202. pixel un área de 16x16 pixels (256 posibilidades). Si la
  3203. imagen tuviese un tamaño de 320x200, daría lugar a otra de
  3204. 5120x3200. Además, aparte de no conseguir una imagen de gran
  3205. calidad, el software para generarla sería tremendamente pesado
  3206. y lento. 
  3207.  
  3208.      Existe otra técnica para transformar imágenes de color a
  3209. blanco y negro: el dithering.
  3210.      El dithering es un proceso algorítmico de reducción de
  3211. una imagen de color a una serie de puntos blancos y negros, de
  3212. forma que la escala de grises de la imagen original se
  3213. conserva en cierta medida. El dithering parece hacer lo
  3214. imposible. Aplicando el dither adecuado a una imagen en color,
  3215. se puede crear una imagen monocromática de las mismas
  3216. dimensiones conservando lo que parece ser gran parte de la
  3217. información de la escala de grises.
  3218.  
  3219. 7.2.3.1 REDUCCION A TONOS DE GRIS.
  3220.  
  3221.      Cualquier imagen en color se puede reducir a otra de
  3222. escala de grises sumando simplemente los colores aditivos
  3223. primarios (rojo, verde y azul). La fórmula para hacerlo es
  3224. como sigue:
  3225.  
  3226.      gris = 0.30*rojo + 0.59*verde + 0.11*azul
  3227.  
  3228.      Si se aplica esta fórmula a la paleta de colores de un
  3229. fichero, bastará con sustituir cada una de las componentes RGB
  3230. de cada color por el resultado obtenido, para obtener la
  3231. imagen en tonos de gris. Aunque esto es todo lo que se
  3232. necesita, los resultados pueden no ser muy adecuados. Es
  3233. aconsejable 'remapear' las sombras de grises un poco, con lo
  3234. que se consigue un mayor contraste de la imagen original.
  3235.      Remapear la escala de grises implica expandir el núcleo
  3236. central de la escala. Aunque es posible hacerlo usando una
  3237. función, se obtienen mejores resultados usando una paleta o
  3238. mapa de grises. El valor del gris original de la fórmula
  3239. anterior se utiliza como índice a la paleta de grises. En la
  3240. aplicación se usa un mapa de 256 grises, cuyos valores han
  3241. sido determinados por el método de tanteos. Pueden cambiarse
  3242. los valores para obtener otros resultados.
  3243.  
  3244. 7.2.3.2 APROXIMACION AL DITHERING. METODO BAYER.
  3245.  
  3246.      La manera más simple de crear una imagen monocromática a
  3247. partir de un dibujo en color reducido a escala de grises es
  3248. utilizar un umbral (threshold). Consiste simplemente en
  3249. asignar un nivel arbitrario debajo del cual un pixel se
  3250. considerará negro, y sobre el cual, se considerará blanco. Si
  3251. se define el threshold a medio camino entre el blanco y el
  3252. negro, partiendo de que el blanco sería 255, el threshold será
  3253. 127. Cualquier pixel con un nivel de gris mayor que 127
  3254. quedará como blanco.
  3255.      El inconveniente de este enfoque es bastante obvio.
  3256. Innumerables detalles de la imagen en color original
  3257. desaparecen y el dibujo queda excesivamente contrastado.
  3258. Pueden obtenerse otros resultados cambiando el valor del
  3259. threshold, pero el gráfico final nunca será especialmente
  3260. bueno.
  3261.      Una de las primeras formas de dithering usadas en
  3262. microordenadores fue el 'pattern dithering'. El dither Bayer
  3263. es uno de los más frecuentes.
  3264.      El principio de un dither Bayer es comparar las escalas
  3265. de grises de la imagen original con un patrón o modelo fijo
  3266. (dither pattern). Este modelo tiene una matriz de 8x8, de
  3267. forma que la escala de grises se reduce a 64 niveles posibles.
  3268. Una vez hecho esto, cada bloque de 8x8 de la imagen es
  3269. comparado con el modelo. Los pixels de la imagen fuente que
  3270. superen los elementos correspondientes en la matriz serán
  3271. pixels blancos en la imagen destino. Los que no los superen,
  3272. serán negros.
  3273.  
  3274. 7.2.3.3 DIFUSION DE ERRORES. ALGORITMOS.
  3275.  
  3276.      El problema del método Bayer es que  imprime un modelo
  3277. muy rígido sobre las imágenes que procesa, sin tener en cuenta
  3278. el contenido de la imagen. El modelo que el dither Bayer
  3279. imprime en una imagen es conocido como 'artefacto' (artifact).
  3280. Los artefactos son subproductos visuales no deseados del
  3281. tratamiento de imagen. En dithering se pretende crear un
  3282. proceso que produzca una ilusión fiable de continuas escalas
  3283. de tonos grises sin artefactos visibles. El camino para llegar
  3284. a ello es emplear la difusión de errores.
  3285.      Si, por ejemplo, se desea comparar un pixel de escala de
  3286. grises con un threshold, cuyo valor es 127, y el pixel tiene
  3287. un nivel de gris de 150, el pixel será blanco. Sin embargo hay
  3288. un error de 23 (la diferencia entre el nivel de gris del pixel
  3289. y el nivel del threshold). Si este error se expande a los
  3290. pixels circundantes, los efectos serán menos evidentes en el
  3291. dither final. Hay que tener en cuenta que estos pixels también
  3292. tendrán errores. El resultado será constituir una serie de
  3293. pixels blancos y negros que se parecerá mucho a la escala de
  3294. grises original.
  3295.  
  3296.      El algoritmo más conocido en la difusión de errores es el
  3297. filtro Floyd-Steinberg 1975. El filtro es el siguiente:
  3298.  
  3299.         X    7
  3300.     3    5    1
  3301.  
  3302.      La lectura de un esquema de difusión de error es más
  3303. simple de lo que parece. Obsérvese que todos los números del
  3304. esquema suman 16. Dado que hay un error entre el pixel en X y
  3305. el threshold entre el blanco y el negro, se debe añadir 7/16
  3306. del error al pixel que está justo a la derecha de X; 3/16 al
  3307. pixel que está a la izquierda de X y un pixel abajo; 5/16 al
  3308. que está debajo de X y el 1/16 restante al que está una
  3309. posición abajo y a la derecha de X.
  3310.      Una vez hecho esto, se selecciona el siguiente pixel de
  3311. la imagen y se repite el proceso.
  3312.  
  3313.      Los resultados del filtro Floyd-Steinberg son bastante
  3314. buenos. Se pueden mejorar usando un filtro que se comunique
  3315. con un número mayor de pixels, extendiendo el error sobre más
  3316. puntos.
  3317.  
  3318.      El filtro Stucki mejora los resultados del F-S, o mejor
  3319. dicho, produce unos diferentes, ya que los resultados en
  3320. dithering son siempre un poco subjetivos. El dither Stucki
  3321. funciona como sigue:
  3322.  
  3323.         X    8    4
  3324. 2    4    8    4    2
  3325. 1    2    4    2    1
  3326.  
  3327.      Los números suman 42, de forma que el pixel a la derecha
  3328. de X obtendría un 8/42 del error y así sucesivamente.
  3329.      Su inconveniente es que es lento.
  3330.  
  3331.  
  3332.      El tercer filtro de dithering más comúnmente encontrado
  3333. es el Burkes. Es un punto medio entre los dos anteriores. Se
  3334. representa de la siguiente forma:
  3335.  
  3336.         X    8    4
  3337. 2    4    8    4    2
  3338.  
  3339.     Existen otros filtros con mayor difusión pero muy lentos
  3340. para ser ejecutados en un microordenador.
  3341.  
  3342.      Así tenemos el filtro Sierra:
  3343.  
  3344.         X    5    3
  3345. 2    4    5    4    2
  3346.     2    3    2
  3347.  
  3348.  
  3349.      El filtro Jarvice, Judice y Ninke:
  3350.  
  3351.         X    7    5
  3352. 3    5    7    5    3
  3353. 1    3    5    3    1
  3354.  
  3355.  
  3356.      Y el filtro Stevenson & Arce:
  3357.  
  3358.                     X                32
  3359. 12        26            30            16
  3360.     12            26            12
  3361. 5            12            12            5
  3362.  
  3363.  
  3364.      Para concluir con el dithering, simplemente decir que
  3365. todo lo visto en este capítulo tan solo pretende introducir al
  3366. lector un poco en el tema, ya que existen multitud de técnicas
  3367. y variaciones acerca del mismo, y no solo en lo referente a
  3368. dithering. Estas y otras técnicas (más elaboradas) se aplican
  3369. a imágenes en colores para reducir el número de estos,
  3370. difuminar, contrastar, etc. 
  3371.  
  3372.      En esta aplicación se han implementado los algoritmos
  3373. Floyd-Steinberg, Stucki y Burkes basados en la difusión de
  3374. errores y el Bayer Pattern para reducir imágenes en color a
  3375. blanco y negro. También se aplica el método de la fórmula para
  3376. convertir las imágenes a tonos de gris. El módulo de la
  3377. aplicación encargado de realizar estos procesos es COLOR. 7.2.4 OBTENCION DE NEGATIVOS.
  3378.  
  3379.      Otra operación usada en el tratamiento de imágenes y que
  3380. se añade a este estudio a modo de introducción es la obtención
  3381. de negativos de imágenes.
  3382.  
  3383.      No es difícil intuir que el negativo de una imagen
  3384. monocromática, se obtiene cambiando los pixels de color negro
  3385. por blancos y viceversa.
  3386.  
  3387.         En realidad si se supone que el valor para el negro es 0
  3388. y para el blanco es 255, para convertir el blanco en negro, lo
  3389. que se hace es restar a 255 el valor del blanco (también 255),
  3390. dando como resultado 0 (negro). Haciendo la misma operación
  3391. con el negro (restarlo a 255) se obtiene el blanco. Si en una
  3392. paleta de gris se restan a 255 los valores de cada uno de los
  3393. tonos de gris, se obtienen los tonos de la paleta invertida.
  3394.  
  3395.      El negativo de una imagen a color se basa en el mismo
  3396. principio. Para convertir una imagen a color en su imagen
  3397. negativa, se restan cada uno de los tres componentes de color
  3398. (rojo, verde y azul) al valor 255, y se sustituye cada
  3399. resultado en la paleta de colores.
  3400.  
  3401.      Para obtener el negativo de una imagen monocromática, se
  3402. leerán todas las líneas de la imagen y se negarán todos sus
  3403. bytes. 
  3404.      Para obtener el negativo de una imagen EGA o VGA bastará
  3405. con aplicar a la paleta las operaciones descritas
  3406. anteriormente. 7.2.5 ESCALADO DEL NUMERO DE COLORES.
  3407.  
  3408.      En la conversión de imágenes de color entre distintos
  3409. formatos gráficos, se plantea en ocasiones el caso de que una
  3410. imagen con un determinado número de colores se almacena con un
  3411. número superior de colores que los que realmente tiene. Este
  3412. es el caso por ejemplo de los ficheros PCX, en los que toda
  3413. imagen de más de 16 colores, se almacena con una paleta de 256
  3414. tonalidades. Si se lee una imagen PCX de este tipo y se
  3415. pretende convertir a una imagen BMP, en la que solamente se
  3416. guarda una paleta con el número de colores usado, se grabará
  3417. información de más en el fichero de salida, haciendo que éste
  3418. ocupe más espacio en disco y que además no contenga una
  3419. información acorde con la imagen que representa.
  3420.  
  3421.      No se pretende en este estudio mostrar las técnicas para
  3422. la reducción de colores similar al dithering, ya que no es
  3423. objetivo del mismo. Tan sólo se intenta que cada imagen guarde
  3424. el número correcto de colores que contiene. Esto no siempre es
  3425. posible. Por ejemplo, el caso contrario al ejemplo anterior.
  3426. En tal caso no habría que reducir sino, ampliar la tabla de
  3427. colores. Ambos procesos (reducción y ampliación) serán
  3428. designados aquí genéricamente con el término escalado de
  3429. colores.
  3430.  
  3431.      Para escalar una tabla de colores, se utiliza un factor
  3432. de escalado que viene dado por la relación entre el número de
  3433. colores original y el de destino.
  3434.      La nueva paleta posee los mismos colores que la anterior
  3435. con la diferencia de que la posición de los triples RGB no es
  3436. la misma. La nueva posición del color RGB viene dada por el
  3437. resultado de multiplicar la antigua posición por el factor de
  3438. escalado. El proceso es el mismo discutido en el escalado del
  3439. tamaño de las imágenes.
  3440.  
  3441.      Así, si se tiene una paleta de 16 colores y se pretende
  3442. convertirla a 256, el factor será 256/16 = 16. Los colores
  3443. originales situados en la paleta de color en las posiciones
  3444. 0,1,2,3,...,15 se encontrarán en la nueva paleta de 256
  3445. colores, después de multiplicarlos por el factor, en las
  3446. posiciones 0 a 15, 16 a 31, 32 a 47, 48 a 63,...,240
  3447. respectivamente. 
  3448.      Si se parte de una paleta de 256, el factor es 16/256. Al
  3449. aplicar el factor, los resultados serán los inversos. Los
  3450. colores del 0 al 15 serán sustituidos por el 0 en la posición
  3451. 0, los del 16 al 31 por el 16 en la posición 1, y así
  3452. sucesivamente.
  3453.  
  3454.      La aplicación de la reducción de colores a una imagen
  3455. dará resultados insospechados si previamente no se aplicó la
  3456. ampliación, ya que los colores en una imagen de menos
  3457. tonalidades no se encuentran dispersos en la paleta.
  3458.  
  3459.      Habría sido más fácil optar por la solución de mantener
  3460. la posición de los colores en la paleta, dejándolos en las
  3461. primeras posiciones pero haciéndolo de esta manera, se
  3462. consigue una distribución del color que se va repitiendo por
  3463. bloques a lo largo de la paleta, algo que luego será de mucha
  3464. utilidad si se desea obtener un resultado medianamente
  3465. aceptable a la hora de convertir las imágenes a blanco y negro
  3466. (por dithering) como paso previo a la impresión de las
  3467. imágenes.  7.3 IMPRESION DE IMAGENES.
  3468.  
  3469.      Ya se adelantaron los distintos tipos de impresoras en el
  3470. apartado 3.1.4. Se procederá ahora a estudiar la manera de
  3471. imprimir las imágenes en las impresoras EPSON FX80 (o
  3472. compatibles) y PostScript. 
  3473.  
  3474.  
  3475. 7.3.1 LA IMPRESORA EPSON FX-80.
  3476.  
  3477.      La elección de la impresora EPSON como ejemplo para la
  3478. impresión de imágenes no es ni mucho menos aleatoria. Esta
  3479. impresora se ha convertido en estándar dentro de las de su
  3480. clase.
  3481.      Normalmente las impresoras matriciales poseen un conjunto
  3482. de códigos de control o secuencias de escape para realizar
  3483. determinadas operaciones como son la definición del tipo de
  3484. letra, la calidad de impresión, el modo gráfico, etc.
  3485.      Se denominan secuencias de escape porque comienzan con el
  3486. carácter ESCAPE (27). Muchas impresoras aceptan los mismos
  3487. códigos que la impresora EPSON.
  3488.  
  3489.      Por otra parte, lo de menos son las secuencias de escape,
  3490. lo importante es comprender cómo funciona una impresora
  3491. matricial en modo gráfico y cual es el método para codificar y
  3492. enviar la imagen, aspecto común en la mayoría de las
  3493. impresoras de este tipo. El proceso para transportar la
  3494. técnica a otra impresora matricial no debe suponer ninguna
  3495. dificultad más que la de sustituir los códigos (y en ocasiones
  3496. su orden) por los del nuevo periférico.
  3497.  
  3498.      Se ha mencionado anteriormente la problemática de la
  3499. impresión de imágenes a color en dispositivos de blanco y
  3500. negro. Este tema ha sido tratado en el apartado dedicado al
  3501. dithering. La EPSON FX80 es una impresora de 8 agujas en
  3502. blanco y negro, por consiguiente, un paso previo a la
  3503. impresión es la conversión de la imagen a monocromática. La
  3504. conversión de una imagen de menos de 256 colores a blanco y
  3505. negro conlleva el paso previo de escalar la imagen a 256
  3506. colores, lo que proporciona mejores resultados al aplicar el
  3507. algoritmo de dithering. El método de dithering usado es el de
  3508. Floyd-Steinberg. Una vez hecho esto se está en condiciones de
  3509. enviar la imagen a la impresora.
  3510.  
  3511.      Una línea de datos de una imagen monocroma vista en el
  3512. monitor consiste en un número de bytes consecutivos en los que
  3513. cada bit de cada byte controla un pixel. Un byte de una imagen
  3514. gráfica enviado a una impresora dará como resultado la
  3515. impresión de 8 pixels en el papel, pero éstos se imprimirán
  3516. verticalmente. El primer byte enviado a la impresora
  3517. constituye el primer pixel de las ocho primeras líneas. El
  3518. siguiente byte serán los segundos pixels de las ocho primeras
  3519. líneas y así sucesivamente hasta completar el ancho de la
  3520. imagen. A continuación el siguiente byte se corresponderá con
  3521. los primeros pixels de las líneas  9 a 16 y así hasta el
  3522. final.
  3523.  
  3524.      Se requiere una gran cantidad de manipulaciones a nivel
  3525. de bits para convertir una imagen de mapa de bits y enviarla
  3526. en el orden correcto a la impresora.
  3527.  
  3528.      Además de esto, deben enviarse códigos de escape. Es
  3529. preciso indicar a la impresora que no se van a imprimir
  3530. caracteres, sino gráficos. Cada línea de información gráfica
  3531. debe ir precedida por una secuencia de escape que dice a la
  3532. impresora la resolución con la que será impresa la línea y el
  3533. número de bytes de información a procesar como gráfico (el
  3534. ancho de la línea). Después de cada línea debe enviarse los
  3535. códigos para que el papel avance exactamente 8 pixels y el
  3536. cabezal se sitúe de nuevo al comienzo de la línea.
  3537.  
  3538.      Los códigos más importantes para la impresión de imágenes
  3539. gráficas en una FX80 son los que inicializan la impresora, los
  3540. que seleccionan el modo gráfico y los que indican el ancho de
  3541. la línea a procesar.
  3542.  
  3543.      Para inicializar la impresora se usa la secuencia:
  3544.  
  3545.      ESC @
  3546.  
  3547.      Las secuencias de escape para los distintos modos
  3548. gráficos son las siguientes[5]:
  3549.  
  3550. SECUENCIA    ACCION
  3551. ESC K n1 n2  Densidad normal 60 puntos/pulgada, 640 pixels de ancho máximo
  3552. ESC L n1 n2  Doble densidad 120 ppp, 1280 pixels máximo
  3553. ESC Y n1 n2  Doble densidad, alta velocidadIgual al anterior, más rápido
  3554. ESC Z n1 n2  Cuádruple densidad, 2500 ppp
  3555.  
  3556. Donde:
  3557.  
  3558. ESC es el código ESCAPE (27).
  3559.  
  3560. K, L, Y o Z se envían tal cual.
  3561.  
  3562. n1, n2 son dos bytes para indicar el ancho de la línea.
  3563. n1 es el byte menos significativo y n2 el byte más
  3564. significativo.
  3565.     Otra manera de especificar el modo gráfico es usando la
  3566. secuencia de escape:
  3567.  
  3568. ESC * modo n1 n2
  3569.  
  3570. En este caso, los modos son los siguientes:
  3571.  
  3572. CODIGO  MODO
  3573. 00H     Densidad normal
  3574. 01H     Doble densidad, baja velocidad
  3575. 02H     Doble densidad, alta velocidad
  3576. 03H     Densidad cuádruple
  3577. 04H     Emulación Epson QX-10
  3578. 05H     Emulación plotter
  3579. 06H     Pixels cuadrados
  3580.  
  3581.     Por último, el avance del papel se consigue con la secuencia:
  3582.  
  3583.     ESC J n
  3584.  
  3585.     Donde n especifica un avance de n/216 pulgadas.
  3586.  
  3587.     El proceso para la impresión de las imágenes es el
  3588. siguiente:
  3589.  
  3590.     Inicializar impresora
  3591.     PARA cada 8 líneas de la imagen
  3592.         Enviar modo gráfico y ancho de línea
  3593.         Transformar y enviar las líneas
  3594.         Avanzar el papel
  3595.         Inicializar impresora
  3596.  
  3597.     Antes de proceder a enviar un carácter a la impresora, se
  3598. deberá testar si está o no ocupada. Además debe de ofrecerse
  3599. la posibilidad de poder abortar el proceso.
  3600.  
  3601.     La impresión directa se realiza usando la interrupción
  3602. 17H que se encarga de los servicios del puerto de la
  3603. impresora. Los servicios que proporciona son los siguientes:
  3604.  
  3605. INT 17,0 Imprimir carácter
  3606. INT 17,1 Inicializar puerto de impresora
  3607. INT 17,2 Leer estado del puerto de impresora
  3608.  
  3609.     El registro de estado del puerto se devuelve en el
  3610. registro AH del procesador. Sus valores son:
  3611.  
  3612.      Bit 0: Time-out
  3613.      Bits 1-2: No usados
  3614.      Bit 3: 1 = error entrada/salida
  3615.      Bit 4: 1 = impresora on-line
  3616.      Bit 5: 1 = Sin papel
  3617.      Bit 6: 1 = reconocimiento
  3618.      Bit 7: 1 = no ocupada
  3619. 7.3.2 IMPRESORA POSTSCRIPT.
  3620.  
  3621.      Como se ha constatado previamente, el término PostScript
  3622. denota un lenguaje de descripción de página usado en
  3623. impresoras láser[1]. PostScript es un lenguaje con notación
  3624. postfija que incluye primitivas de dibujo, definición de tipos
  3625. de letra, escalado de imágenes, etc. Además permite el
  3626. tratamiento de imágenes de mapa de bits.
  3627.      El código Postscript para la impresión de una imagen
  3628. puede guardarse en un fichero ASCII; con las ventajas que esto
  3629. conlleva. Puede visualizarse y editarse.
  3630.  
  3631.      Un fichero Postscript que contenga una imagen bitmap
  3632. tiene en primer lugar una serie de comentarios. Estos
  3633. comienzan con los caracteres %%. Identifican al fichero
  3634. Postscript y dan información acerca de las dimensiones de la
  3635. imagen el autor, etc.
  3636.      A continuación aparecen los parámetros de la imagen y las
  3637. órdenes para la impresión del bitmap. Esta es la información
  3638. que se codifica con notación postfija.
  3639.  
  3640.      Tras las instrucciones aparece el bitmap como una serie
  3641. de valores hexadecimales.
  3642.  
  3643.      Por último, la instrucción para imprimir la imagen:
  3644. showpage.
  3645.  
  3646.      La aplicación prevé la impresión de imágenes en blanco y
  3647. negro y a color. Estas últimas deben convertirse a gris.
  3648.  
  3649.      No es objeto de este trabajo explicar la sintaxis y
  3650. filosofía del PostScript, existen multitud de libros que
  3651. tratan sobre este potente lenguaje a los que acudir para
  3652. profundizar en el tema. En la aplicación se ha usado un
  3653. sencillo método para la impresión, extraído de ficheros de
  3654. salida postscript de otras aplicaciones.
  3655.        Apendice A:  Lista numérica de Tags. TIFF Versión 5.0
  3656.  
  3657. TAG (Nombre y número)                Tipo             Valor por defecto
  3658. NewSubfileType            254 (FE)   LONG             1
  3659. SubfileType               255 (FF)   SHORT            1
  3660. ImageWidth                256 (100)  SHORT o LONG     1
  3661. ImageLength               257 (101)  SHORT o LONG     1
  3662. BitsPerSample             258 (102)  SHORT            SamplesPerPixel
  3663. Compression               259 (103)  SHORT            1
  3664. PhotometricInterpretation 262 (106)  SHORT            1
  3665. Threshholding             263 (107)  SHORT            1
  3666. CellWidth                 264 (108)  SHORT            1
  3667. CellLength                265 (109)  SHORT            1
  3668. FillOrder                 266 (10A)  SHORT            1
  3669. DocumentName              269 (10D)  ASCII
  3670. ImageDescription          270 (10E)  ASCII
  3671. Make                      271 (10F)  ASCII
  3672. Model                     272 (110)  ASCII
  3673. StripOffsets              273 (111)  SHORT o LONG     StripsPerImage si
  3674.                             PlanarConfiguration es 1.
  3675.                             SamplesPerPixel * StripsPerImage si
  3676.                             PlanarConfiguration es 2.
  3677. Orientation               274 (112)  SHORT            1
  3678. SamplesPerPixel           277 (115)  SHORT            1
  3679. RowsPerStrip              278 (116)  SHORT o LONG     1
  3680. StripByteCounts           279 (117)  LONG o SHORT     StripsPerImage si
  3681.                             PlanarConfiguration es 1.
  3682.                             SamplesPerPixel * StripsPerImage si
  3683.                             PlanarConfiguration es 2.
  3684. MinSampleValue            280 (118)  SHORT            SamplesPerPixel
  3685. MaxSampleValue            281 (119)  SHORT            SamplesPerPixel
  3686. XResolution               282 (11A)  RATIONAL         1
  3687. YResolution               283 (11B)  RATIONAL         1
  3688. PlanarConfiguration       284 (11C)  SHORT            1
  3689. PageName                  285 (11D)  ASCII
  3690. Xposition                 286 (11E)  RATIONAL
  3691. YPosition                 287 (11F)  RATIONAL
  3692. FreeOffsets               288 (120)  LONG
  3693. FreeByteCounts            289 (121)  LONG
  3694. GrayResponseUnit          290 (122)  SHORT            1
  3695. GrayResponseCurve         291 (123)  SHORT            2**BitsPerSample
  3696. Group3Options             292 (124)  LONG             1
  3697. Group4Options             293 (125)  LONG             1
  3698. ResolutionUnit            296 (128)  SHORT            1
  3699. 0PageNumber               297 (129)  SHORT            2
  3700. ColorResponseCurves       301 (12D)  SHORT            3 * (2**BitsPerSample)
  3701. Software                  305 (131)  ASCII
  3702. DateTime                  306 (132)  ASCII
  3703. Artist                    315 (13B)  ASCII
  3704. HostComputer              316 (13C)  ASCII
  3705. Predictor                 317 (13D)  SHORT            1
  3706. WhitePoint                318 (13E)  RATIONAL         2
  3707. PrimaryChromaticities     319 (13F)  RATIONAL         6
  3708. ColorMap                  320 (140)  SHORT            3 * (2**BitsPerSample)
  3709. BIBLIOGRAFIA
  3710.  
  3711.            [1] Bit-Mapped Graphics, 1990. Steve Rimmer. Windcrest Books.
  3712.  
  3713.            [2] Programación en Windows, 1992. Charles Petzold. Anaya
  3714.            Multimedia S.A.
  3715.  
  3716.            [3] TIFF 5.0 An Aldus/Microsoft Technical Memorandum 1988.
  3717.            Aldus Corp./Microsoft Corp.
  3718.  
  3719.            [4] Manual del usuario PM 3580/PM 3585. Philips Corp.
  3720.  
  3721.            [5] Manual de usuario Impresora Amstrad DMP 3000, 1987. Amstrad
  3722.            plc.
  3723.  
  3724.            [6] Guía de referencia para programadores en Informática
  3725.            gráfica. Alfredo Sanz. Fidonet.
  3726.  
  3727.            [7] PC WORLD nº 61 "Formatos gráficos". J. de Iraolagoitia.
  3728.  
  3729.            [8] PC MANIA nº 20 "El formato IMG", 1994. J. Domínguez.
  3730.  
  3731.            [9] PC MANIA nº 23 "El formato GIF (II)", 1994. J. Domínguez.
  3732.  
  3733.            [10] PC MANIA nº 24 "El formato GIF (III)", 1994. J. Domínguez.
  3734.  
  3735.            [11] PC ACTUAL "Formatos gráficos", Julio 1993. Cura/Sanz.
  3736.  
  3737.            [12] Manual de uso Turbo C++ 2.0. Borland International.
  3738.  
  3739.            [13] Manual de uso Turbo Assembler. Borland International.
  3740.  
  3741.            [14] Manual de uso Sistema Operativo DOS. Microsoft Corp.
  3742.  
  3743.            [15] Programación gráfica en C, 1991. Lee Adams. Anaya
  3744.        Multimadia S.A.
  3745.